1
|
|
|
/*! jQuery UI - v1.12.0 - 2016-08-18 |
2
|
|
|
* http://jqueryui.com |
3
|
|
|
* Includes: widget.js, data.js, disable-selection.js, scroll-parent.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/mouse.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js |
4
|
|
|
* Copyright jQuery Foundation and other contributors; Licensed MIT */ |
5
|
|
|
|
6
|
|
|
(function( factory ) { |
7
|
|
|
if ( typeof define === "function" && define.amd ) { |
|
|
|
|
8
|
|
|
|
9
|
|
|
// AMD. Register as an anonymous module. |
10
|
|
|
define([ "jquery" ], factory ); |
11
|
|
|
} else { |
12
|
|
|
|
13
|
|
|
// Browser globals |
14
|
|
|
factory( jQuery ); |
15
|
|
|
} |
16
|
|
|
}(function( $ ) { |
17
|
|
|
|
18
|
|
|
$.ui = $.ui || {}; |
19
|
|
|
|
20
|
|
|
var version = $.ui.version = "1.12.0"; |
21
|
|
|
|
22
|
|
|
|
23
|
|
|
/*! |
24
|
|
|
* jQuery UI Widget 1.12.0 |
25
|
|
|
* http://jqueryui.com |
26
|
|
|
* |
27
|
|
|
* Copyright jQuery Foundation and other contributors |
28
|
|
|
* Released under the MIT license. |
29
|
|
|
* http://jquery.org/license |
30
|
|
|
*/ |
31
|
|
|
|
32
|
|
|
//>>label: Widget |
33
|
|
|
//>>group: Core |
34
|
|
|
//>>description: Provides a factory for creating stateful widgets with a common API. |
35
|
|
|
//>>docs: http://api.jqueryui.com/jQuery.widget/ |
36
|
|
|
//>>demos: http://jqueryui.com/widget/ |
37
|
|
|
|
38
|
|
|
|
39
|
|
|
|
40
|
|
|
var widgetUuid = 0; |
41
|
|
|
var widgetSlice = Array.prototype.slice; |
42
|
|
|
|
43
|
|
|
$.cleanData = ( function( orig ) { |
44
|
|
|
return function( elems ) { |
45
|
|
|
var events, elem, i; |
46
|
|
|
for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) { |
|
|
|
|
47
|
|
|
try { |
48
|
|
|
|
49
|
|
|
// Only trigger remove when necessary to save time |
50
|
|
|
events = $._data( elem, "events" ); |
51
|
|
|
if ( events && events.remove ) { |
52
|
|
|
$( elem ).triggerHandler( "remove" ); |
53
|
|
|
} |
54
|
|
|
|
55
|
|
|
// Http://bugs.jquery.com/ticket/8235 |
56
|
|
|
} catch ( e ) {} |
|
|
|
|
57
|
|
|
} |
58
|
|
|
orig( elems ); |
59
|
|
|
}; |
60
|
|
|
} )( $.cleanData ); |
61
|
|
|
|
62
|
|
|
$.widget = function( name, base, prototype ) { |
63
|
|
|
var existingConstructor, constructor, basePrototype; |
64
|
|
|
|
65
|
|
|
// ProxiedPrototype allows the provided prototype to remain unmodified |
66
|
|
|
// so that it can be used as a mixin for multiple widgets (#8876) |
67
|
|
|
var proxiedPrototype = {}; |
68
|
|
|
|
69
|
|
|
var namespace = name.split( "." )[ 0 ]; |
70
|
|
|
name = name.split( "." )[ 1 ]; |
71
|
|
|
var fullName = namespace + "-" + name; |
72
|
|
|
|
73
|
|
|
if ( !prototype ) { |
74
|
|
|
prototype = base; |
75
|
|
|
base = $.Widget; |
76
|
|
|
} |
77
|
|
|
|
78
|
|
|
if ( $.isArray( prototype ) ) { |
79
|
|
|
prototype = $.extend.apply( null, [ {} ].concat( prototype ) ); |
80
|
|
|
} |
81
|
|
|
|
82
|
|
|
// Create selector for plugin |
83
|
|
|
$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { |
84
|
|
|
return !!$.data( elem, fullName ); |
85
|
|
|
}; |
86
|
|
|
|
87
|
|
|
$[ namespace ] = $[ namespace ] || {}; |
88
|
|
|
existingConstructor = $[ namespace ][ name ]; |
89
|
|
|
constructor = $[ namespace ][ name ] = function( options, element ) { |
90
|
|
|
|
91
|
|
|
// Allow instantiation without "new" keyword |
92
|
|
|
if ( !this._createWidget ) { |
93
|
|
|
return new constructor( options, element ); |
|
|
|
|
94
|
|
|
} |
95
|
|
|
|
96
|
|
|
// Allow instantiation without initializing for simple inheritance |
97
|
|
|
// must use "new" keyword (the code above always passes args) |
98
|
|
|
if ( arguments.length ) { |
|
|
|
|
99
|
|
|
this._createWidget( options, element ); |
|
|
|
|
100
|
|
|
} |
101
|
|
|
}; |
102
|
|
|
|
103
|
|
|
// Extend with the existing constructor to carry over any static properties |
104
|
|
|
$.extend( constructor, existingConstructor, { |
105
|
|
|
version: prototype.version, |
106
|
|
|
|
107
|
|
|
// Copy the object used to create the prototype in case we need to |
108
|
|
|
// redefine the widget later |
109
|
|
|
_proto: $.extend( {}, prototype ), |
110
|
|
|
|
111
|
|
|
// Track widgets that inherit from this widget in case this widget is |
112
|
|
|
// redefined after a widget inherits from it |
113
|
|
|
_childConstructors: [] |
114
|
|
|
} ); |
115
|
|
|
|
116
|
|
|
basePrototype = new base(); |
|
|
|
|
117
|
|
|
|
118
|
|
|
// We need to make the options hash a property directly on the new instance |
119
|
|
|
// otherwise we'll modify the options hash on the prototype that we're |
120
|
|
|
// inheriting from |
121
|
|
|
basePrototype.options = $.widget.extend( {}, basePrototype.options ); |
122
|
|
|
$.each( prototype, function( prop, value ) { |
123
|
|
|
if ( !$.isFunction( value ) ) { |
124
|
|
|
proxiedPrototype[ prop ] = value; |
125
|
|
|
return; |
126
|
|
|
} |
127
|
|
|
proxiedPrototype[ prop ] = ( function() { |
128
|
|
|
function _super() { |
129
|
|
|
return base.prototype[ prop ].apply( this, arguments ); |
130
|
|
|
} |
131
|
|
|
|
132
|
|
|
function _superApply( args ) { |
133
|
|
|
return base.prototype[ prop ].apply( this, args ); |
134
|
|
|
} |
135
|
|
|
|
136
|
|
|
return function() { |
137
|
|
|
var __super = this._super; |
138
|
|
|
var __superApply = this._superApply; |
139
|
|
|
var returnValue; |
140
|
|
|
|
141
|
|
|
this._super = _super; |
142
|
|
|
this._superApply = _superApply; |
143
|
|
|
|
144
|
|
|
returnValue = value.apply( this, arguments ); |
145
|
|
|
|
146
|
|
|
this._super = __super; |
147
|
|
|
this._superApply = __superApply; |
148
|
|
|
|
149
|
|
|
return returnValue; |
150
|
|
|
}; |
151
|
|
|
} )(); |
152
|
|
|
} ); |
153
|
|
|
constructor.prototype = $.widget.extend( basePrototype, { |
154
|
|
|
|
155
|
|
|
// TODO: remove support for widgetEventPrefix |
156
|
|
|
// always use the name + a colon as the prefix, e.g., draggable:start |
157
|
|
|
// don't prefix for widgets that aren't DOM-based |
158
|
|
|
widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name |
159
|
|
|
}, proxiedPrototype, { |
160
|
|
|
constructor: constructor, |
161
|
|
|
namespace: namespace, |
162
|
|
|
widgetName: name, |
163
|
|
|
widgetFullName: fullName |
164
|
|
|
} ); |
165
|
|
|
|
166
|
|
|
// If this widget is being redefined then we need to find all widgets that |
167
|
|
|
// are inheriting from it and redefine all of them so that they inherit from |
168
|
|
|
// the new version of this widget. We're essentially trying to replace one |
169
|
|
|
// level in the prototype chain. |
170
|
|
|
if ( existingConstructor ) { |
171
|
|
|
$.each( existingConstructor._childConstructors, function( i, child ) { |
172
|
|
|
var childPrototype = child.prototype; |
173
|
|
|
|
174
|
|
|
// Redefine the child widget using the same prototype that was |
175
|
|
|
// originally used, but inherit from the new version of the base |
176
|
|
|
$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, |
177
|
|
|
child._proto ); |
178
|
|
|
} ); |
179
|
|
|
|
180
|
|
|
// Remove the list of existing child constructors from the old constructor |
181
|
|
|
// so the old child constructors can be garbage collected |
182
|
|
|
delete existingConstructor._childConstructors; |
183
|
|
|
} else { |
184
|
|
|
base._childConstructors.push( constructor ); |
185
|
|
|
} |
186
|
|
|
|
187
|
|
|
$.widget.bridge( name, constructor ); |
188
|
|
|
|
189
|
|
|
return constructor; |
190
|
|
|
}; |
191
|
|
|
|
192
|
|
|
$.widget.extend = function( target ) { |
193
|
|
|
var input = widgetSlice.call( arguments, 1 ); |
194
|
|
|
var inputIndex = 0; |
195
|
|
|
var inputLength = input.length; |
196
|
|
|
var key; |
197
|
|
|
var value; |
198
|
|
|
|
199
|
|
|
for ( ; inputIndex < inputLength; inputIndex++ ) { |
200
|
|
|
for ( key in input[ inputIndex ] ) { |
201
|
|
|
value = input[ inputIndex ][ key ]; |
202
|
|
|
if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { |
203
|
|
|
|
204
|
|
|
// Clone objects |
205
|
|
|
if ( $.isPlainObject( value ) ) { |
206
|
|
|
target[ key ] = $.isPlainObject( target[ key ] ) ? |
207
|
|
|
$.widget.extend( {}, target[ key ], value ) : |
208
|
|
|
|
209
|
|
|
// Don't extend strings, arrays, etc. with objects |
210
|
|
|
$.widget.extend( {}, value ); |
211
|
|
|
|
212
|
|
|
// Copy everything else by reference |
213
|
|
|
} else { |
214
|
|
|
target[ key ] = value; |
215
|
|
|
} |
216
|
|
|
} |
217
|
|
|
} |
218
|
|
|
} |
219
|
|
|
return target; |
220
|
|
|
}; |
221
|
|
|
|
222
|
|
|
$.widget.bridge = function( name, object ) { |
223
|
|
|
var fullName = object.prototype.widgetFullName || name; |
224
|
|
|
$.fn[ name ] = function( options ) { |
225
|
|
|
var isMethodCall = typeof options === "string"; |
226
|
|
|
var args = widgetSlice.call( arguments, 1 ); |
227
|
|
|
var returnValue = this; |
228
|
|
|
|
229
|
|
|
if ( isMethodCall ) { |
230
|
|
|
this.each( function() { |
231
|
|
|
var methodValue; |
232
|
|
|
var instance = $.data( this, fullName ); |
233
|
|
|
|
234
|
|
|
if ( options === "instance" ) { |
235
|
|
|
returnValue = instance; |
236
|
|
|
return false; |
237
|
|
|
} |
238
|
|
|
|
239
|
|
|
if ( !instance ) { |
240
|
|
|
return $.error( "cannot call methods on " + name + |
241
|
|
|
" prior to initialization; " + |
242
|
|
|
"attempted to call method '" + options + "'" ); |
243
|
|
|
} |
244
|
|
|
|
245
|
|
|
if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) { |
246
|
|
|
return $.error( "no such method '" + options + "' for " + name + |
247
|
|
|
" widget instance" ); |
248
|
|
|
} |
249
|
|
|
|
250
|
|
|
methodValue = instance[ options ].apply( instance, args ); |
251
|
|
|
|
252
|
|
|
if ( methodValue !== instance && methodValue !== undefined ) { |
|
|
|
|
253
|
|
|
returnValue = methodValue && methodValue.jquery ? |
254
|
|
|
returnValue.pushStack( methodValue.get() ) : |
255
|
|
|
methodValue; |
256
|
|
|
return false; |
257
|
|
|
} |
258
|
|
|
} ); |
259
|
|
|
} else { |
260
|
|
|
|
261
|
|
|
// Allow multiple hashes to be passed on init |
262
|
|
|
if ( args.length ) { |
263
|
|
|
options = $.widget.extend.apply( null, [ options ].concat( args ) ); |
264
|
|
|
} |
265
|
|
|
|
266
|
|
|
this.each( function() { |
267
|
|
|
var instance = $.data( this, fullName ); |
268
|
|
|
if ( instance ) { |
269
|
|
|
instance.option( options || {} ); |
270
|
|
|
if ( instance._init ) { |
271
|
|
|
instance._init(); |
272
|
|
|
} |
273
|
|
|
} else { |
274
|
|
|
$.data( this, fullName, new object( options, this ) ); |
|
|
|
|
275
|
|
|
} |
276
|
|
|
} ); |
277
|
|
|
} |
278
|
|
|
|
279
|
|
|
return returnValue; |
280
|
|
|
}; |
281
|
|
|
}; |
282
|
|
|
|
283
|
|
|
$.Widget = function( /* options, element */ ) {}; |
284
|
|
|
$.Widget._childConstructors = []; |
285
|
|
|
|
286
|
|
|
$.Widget.prototype = { |
287
|
|
|
widgetName: "widget", |
288
|
|
|
widgetEventPrefix: "", |
289
|
|
|
defaultElement: "<div>", |
290
|
|
|
|
291
|
|
|
options: { |
292
|
|
|
classes: {}, |
293
|
|
|
disabled: false, |
294
|
|
|
|
295
|
|
|
// Callbacks |
296
|
|
|
create: null |
297
|
|
|
}, |
298
|
|
|
|
299
|
|
|
_createWidget: function( options, element ) { |
300
|
|
|
element = $( element || this.defaultElement || this )[ 0 ]; |
301
|
|
|
this.element = $( element ); |
302
|
|
|
this.uuid = widgetUuid++; |
303
|
|
|
this.eventNamespace = "." + this.widgetName + this.uuid; |
304
|
|
|
|
305
|
|
|
this.bindings = $(); |
306
|
|
|
this.hoverable = $(); |
307
|
|
|
this.focusable = $(); |
308
|
|
|
this.classesElementLookup = {}; |
309
|
|
|
|
310
|
|
|
if ( element !== this ) { |
311
|
|
|
$.data( element, this.widgetFullName, this ); |
312
|
|
|
this._on( true, this.element, { |
313
|
|
|
remove: function( event ) { |
314
|
|
|
if ( event.target === element ) { |
315
|
|
|
this.destroy(); |
316
|
|
|
} |
317
|
|
|
} |
318
|
|
|
} ); |
319
|
|
|
this.document = $( element.style ? |
320
|
|
|
|
321
|
|
|
// Element within the document |
322
|
|
|
element.ownerDocument : |
323
|
|
|
|
324
|
|
|
// Element is window or document |
325
|
|
|
element.document || element ); |
326
|
|
|
this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow ); |
327
|
|
|
} |
328
|
|
|
|
329
|
|
|
this.options = $.widget.extend( {}, |
330
|
|
|
this.options, |
331
|
|
|
this._getCreateOptions(), |
332
|
|
|
options ); |
333
|
|
|
|
334
|
|
|
this._create(); |
335
|
|
|
|
336
|
|
|
if ( this.options.disabled ) { |
337
|
|
|
this._setOptionDisabled( this.options.disabled ); |
338
|
|
|
} |
339
|
|
|
|
340
|
|
|
this._trigger( "create", null, this._getCreateEventData() ); |
341
|
|
|
this._init(); |
342
|
|
|
}, |
343
|
|
|
|
344
|
|
|
_getCreateOptions: function() { |
345
|
|
|
return {}; |
346
|
|
|
}, |
347
|
|
|
|
348
|
|
|
_getCreateEventData: $.noop, |
349
|
|
|
|
350
|
|
|
_create: $.noop, |
351
|
|
|
|
352
|
|
|
_init: $.noop, |
353
|
|
|
|
354
|
|
|
destroy: function() { |
355
|
|
|
var that = this; |
356
|
|
|
|
357
|
|
|
this._destroy(); |
358
|
|
|
$.each( this.classesElementLookup, function( key, value ) { |
359
|
|
|
that._removeClass( value, key ); |
360
|
|
|
} ); |
361
|
|
|
|
362
|
|
|
// We can probably remove the unbind calls in 2.0 |
363
|
|
|
// all event bindings should go through this._on() |
364
|
|
|
this.element |
365
|
|
|
.off( this.eventNamespace ) |
366
|
|
|
.removeData( this.widgetFullName ); |
367
|
|
|
this.widget() |
368
|
|
|
.off( this.eventNamespace ) |
369
|
|
|
.removeAttr( "aria-disabled" ); |
370
|
|
|
|
371
|
|
|
// Clean up events and states |
372
|
|
|
this.bindings.off( this.eventNamespace ); |
373
|
|
|
}, |
374
|
|
|
|
375
|
|
|
_destroy: $.noop, |
376
|
|
|
|
377
|
|
|
widget: function() { |
378
|
|
|
return this.element; |
379
|
|
|
}, |
380
|
|
|
|
381
|
|
|
option: function( key, value ) { |
382
|
|
|
var options = key; |
383
|
|
|
var parts; |
384
|
|
|
var curOption; |
385
|
|
|
var i; |
386
|
|
|
|
387
|
|
|
if ( arguments.length === 0 ) { |
388
|
|
|
|
389
|
|
|
// Don't return a reference to the internal hash |
390
|
|
|
return $.widget.extend( {}, this.options ); |
391
|
|
|
} |
392
|
|
|
|
393
|
|
|
if ( typeof key === "string" ) { |
394
|
|
|
|
395
|
|
|
// Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } |
396
|
|
|
options = {}; |
397
|
|
|
parts = key.split( "." ); |
398
|
|
|
key = parts.shift(); |
399
|
|
|
if ( parts.length ) { |
400
|
|
|
curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); |
401
|
|
|
for ( i = 0; i < parts.length - 1; i++ ) { |
402
|
|
|
curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; |
403
|
|
|
curOption = curOption[ parts[ i ] ]; |
404
|
|
|
} |
405
|
|
|
key = parts.pop(); |
406
|
|
|
if ( arguments.length === 1 ) { |
407
|
|
|
return curOption[ key ] === undefined ? null : curOption[ key ]; |
408
|
|
|
} |
409
|
|
|
curOption[ key ] = value; |
410
|
|
|
} else { |
411
|
|
|
if ( arguments.length === 1 ) { |
412
|
|
|
return this.options[ key ] === undefined ? null : this.options[ key ]; |
413
|
|
|
} |
414
|
|
|
options[ key ] = value; |
415
|
|
|
} |
416
|
|
|
} |
417
|
|
|
|
418
|
|
|
this._setOptions( options ); |
419
|
|
|
|
420
|
|
|
return this; |
421
|
|
|
}, |
422
|
|
|
|
423
|
|
|
_setOptions: function( options ) { |
424
|
|
|
var key; |
425
|
|
|
|
426
|
|
|
for ( key in options ) { |
427
|
|
|
this._setOption( key, options[ key ] ); |
428
|
|
|
} |
429
|
|
|
|
430
|
|
|
return this; |
431
|
|
|
}, |
432
|
|
|
|
433
|
|
|
_setOption: function( key, value ) { |
434
|
|
|
if ( key === "classes" ) { |
435
|
|
|
this._setOptionClasses( value ); |
436
|
|
|
} |
437
|
|
|
|
438
|
|
|
this.options[ key ] = value; |
439
|
|
|
|
440
|
|
|
if ( key === "disabled" ) { |
441
|
|
|
this._setOptionDisabled( value ); |
442
|
|
|
} |
443
|
|
|
|
444
|
|
|
return this; |
445
|
|
|
}, |
446
|
|
|
|
447
|
|
|
_setOptionClasses: function( value ) { |
448
|
|
|
var classKey, elements, currentElements; |
449
|
|
|
|
450
|
|
|
for ( classKey in value ) { |
451
|
|
|
currentElements = this.classesElementLookup[ classKey ]; |
452
|
|
|
if ( value[ classKey ] === this.options.classes[ classKey ] || |
453
|
|
|
!currentElements || |
454
|
|
|
!currentElements.length ) { |
455
|
|
|
continue; |
456
|
|
|
} |
457
|
|
|
|
458
|
|
|
// We are doing this to create a new jQuery object because the _removeClass() call |
459
|
|
|
// on the next line is going to destroy the reference to the current elements being |
460
|
|
|
// tracked. We need to save a copy of this collection so that we can add the new classes |
461
|
|
|
// below. |
462
|
|
|
elements = $( currentElements.get() ); |
463
|
|
|
this._removeClass( currentElements, classKey ); |
464
|
|
|
|
465
|
|
|
// We don't use _addClass() here, because that uses this.options.classes |
466
|
|
|
// for generating the string of classes. We want to use the value passed in from |
467
|
|
|
// _setOption(), this is the new value of the classes option which was passed to |
468
|
|
|
// _setOption(). We pass this value directly to _classes(). |
469
|
|
|
elements.addClass( this._classes( { |
470
|
|
|
element: elements, |
471
|
|
|
keys: classKey, |
472
|
|
|
classes: value, |
473
|
|
|
add: true |
474
|
|
|
} ) ); |
475
|
|
|
} |
476
|
|
|
}, |
477
|
|
|
|
478
|
|
|
_setOptionDisabled: function( value ) { |
479
|
|
|
this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value ); |
480
|
|
|
|
481
|
|
|
// If the widget is becoming disabled, then nothing is interactive |
482
|
|
|
if ( value ) { |
483
|
|
|
this._removeClass( this.hoverable, null, "ui-state-hover" ); |
484
|
|
|
this._removeClass( this.focusable, null, "ui-state-focus" ); |
485
|
|
|
} |
486
|
|
|
}, |
487
|
|
|
|
488
|
|
|
enable: function() { |
489
|
|
|
return this._setOptions( { disabled: false } ); |
490
|
|
|
}, |
491
|
|
|
|
492
|
|
|
disable: function() { |
493
|
|
|
return this._setOptions( { disabled: true } ); |
494
|
|
|
}, |
495
|
|
|
|
496
|
|
|
_classes: function( options ) { |
497
|
|
|
var full = []; |
498
|
|
|
var that = this; |
499
|
|
|
|
500
|
|
|
options = $.extend( { |
501
|
|
|
element: this.element, |
502
|
|
|
classes: this.options.classes || {} |
503
|
|
|
}, options ); |
504
|
|
|
|
505
|
|
|
function processClassString( classes, checkOption ) { |
506
|
|
|
var current, i; |
507
|
|
|
for ( i = 0; i < classes.length; i++ ) { |
508
|
|
|
current = that.classesElementLookup[ classes[ i ] ] || $(); |
509
|
|
|
if ( options.add ) { |
510
|
|
|
current = $( $.unique( current.get().concat( options.element.get() ) ) ); |
511
|
|
|
} else { |
512
|
|
|
current = $( current.not( options.element ).get() ); |
513
|
|
|
} |
514
|
|
|
that.classesElementLookup[ classes[ i ] ] = current; |
515
|
|
|
full.push( classes[ i ] ); |
516
|
|
|
if ( checkOption && options.classes[ classes[ i ] ] ) { |
517
|
|
|
full.push( options.classes[ classes[ i ] ] ); |
518
|
|
|
} |
519
|
|
|
} |
520
|
|
|
} |
521
|
|
|
|
522
|
|
|
if ( options.keys ) { |
523
|
|
|
processClassString( options.keys.match( /\S+/g ) || [], true ); |
524
|
|
|
} |
525
|
|
|
if ( options.extra ) { |
526
|
|
|
processClassString( options.extra.match( /\S+/g ) || [] ); |
527
|
|
|
} |
528
|
|
|
|
529
|
|
|
return full.join( " " ); |
530
|
|
|
}, |
531
|
|
|
|
532
|
|
|
_removeClass: function( element, keys, extra ) { |
533
|
|
|
return this._toggleClass( element, keys, extra, false ); |
534
|
|
|
}, |
535
|
|
|
|
536
|
|
|
_addClass: function( element, keys, extra ) { |
537
|
|
|
return this._toggleClass( element, keys, extra, true ); |
538
|
|
|
}, |
539
|
|
|
|
540
|
|
|
_toggleClass: function( element, keys, extra, add ) { |
541
|
|
|
add = ( typeof add === "boolean" ) ? add : extra; |
542
|
|
|
var shift = ( typeof element === "string" || element === null ), |
543
|
|
|
options = { |
544
|
|
|
extra: shift ? keys : extra, |
545
|
|
|
keys: shift ? element : keys, |
546
|
|
|
element: shift ? this.element : element, |
547
|
|
|
add: add |
548
|
|
|
}; |
549
|
|
|
options.element.toggleClass( this._classes( options ), add ); |
550
|
|
|
return this; |
551
|
|
|
}, |
552
|
|
|
|
553
|
|
|
_on: function( suppressDisabledCheck, element, handlers ) { |
554
|
|
|
var delegateElement; |
555
|
|
|
var instance = this; |
556
|
|
|
|
557
|
|
|
// No suppressDisabledCheck flag, shuffle arguments |
558
|
|
|
if ( typeof suppressDisabledCheck !== "boolean" ) { |
559
|
|
|
handlers = element; |
560
|
|
|
element = suppressDisabledCheck; |
561
|
|
|
suppressDisabledCheck = false; |
562
|
|
|
} |
563
|
|
|
|
564
|
|
|
// No element argument, shuffle and use this.element |
565
|
|
|
if ( !handlers ) { |
566
|
|
|
handlers = element; |
567
|
|
|
element = this.element; |
568
|
|
|
delegateElement = this.widget(); |
569
|
|
|
} else { |
570
|
|
|
element = delegateElement = $( element ); |
571
|
|
|
this.bindings = this.bindings.add( element ); |
572
|
|
|
} |
573
|
|
|
|
574
|
|
|
$.each( handlers, function( event, handler ) { |
575
|
|
|
function handlerProxy() { |
576
|
|
|
|
577
|
|
|
// Allow widgets to customize the disabled handling |
578
|
|
|
// - disabled as an array instead of boolean |
579
|
|
|
// - disabled class as method for disabling individual parts |
580
|
|
|
if ( !suppressDisabledCheck && |
581
|
|
|
( instance.options.disabled === true || |
582
|
|
|
$( this ).hasClass( "ui-state-disabled" ) ) ) { |
583
|
|
|
return; |
|
|
|
|
584
|
|
|
} |
585
|
|
|
return ( typeof handler === "string" ? instance[ handler ] : handler ) |
586
|
|
|
.apply( instance, arguments ); |
587
|
|
|
} |
588
|
|
|
|
589
|
|
|
// Copy the guid so direct unbinding works |
590
|
|
|
if ( typeof handler !== "string" ) { |
591
|
|
|
handlerProxy.guid = handler.guid = |
592
|
|
|
handler.guid || handlerProxy.guid || $.guid++; |
593
|
|
|
} |
594
|
|
|
|
595
|
|
|
var match = event.match( /^([\w:-]*)\s*(.*)$/ ); |
596
|
|
|
var eventName = match[ 1 ] + instance.eventNamespace; |
597
|
|
|
var selector = match[ 2 ]; |
598
|
|
|
|
599
|
|
|
if ( selector ) { |
600
|
|
|
delegateElement.on( eventName, selector, handlerProxy ); |
601
|
|
|
} else { |
602
|
|
|
element.on( eventName, handlerProxy ); |
603
|
|
|
} |
604
|
|
|
} ); |
605
|
|
|
}, |
606
|
|
|
|
607
|
|
|
_off: function( element, eventName ) { |
608
|
|
|
eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) + |
609
|
|
|
this.eventNamespace; |
610
|
|
|
element.off( eventName ).off( eventName ); |
611
|
|
|
|
612
|
|
|
// Clear the stack to avoid memory leaks (#10056) |
613
|
|
|
this.bindings = $( this.bindings.not( element ).get() ); |
614
|
|
|
this.focusable = $( this.focusable.not( element ).get() ); |
615
|
|
|
this.hoverable = $( this.hoverable.not( element ).get() ); |
616
|
|
|
}, |
617
|
|
|
|
618
|
|
|
_delay: function( handler, delay ) { |
619
|
|
|
function handlerProxy() { |
620
|
|
|
return ( typeof handler === "string" ? instance[ handler ] : handler ) |
621
|
|
|
.apply( instance, arguments ); |
622
|
|
|
} |
623
|
|
|
var instance = this; |
624
|
|
|
return setTimeout( handlerProxy, delay || 0 ); |
625
|
|
|
}, |
626
|
|
|
|
627
|
|
|
_hoverable: function( element ) { |
628
|
|
|
this.hoverable = this.hoverable.add( element ); |
629
|
|
|
this._on( element, { |
630
|
|
|
mouseenter: function( event ) { |
631
|
|
|
this._addClass( $( event.currentTarget ), null, "ui-state-hover" ); |
632
|
|
|
}, |
633
|
|
|
mouseleave: function( event ) { |
634
|
|
|
this._removeClass( $( event.currentTarget ), null, "ui-state-hover" ); |
635
|
|
|
} |
636
|
|
|
} ); |
637
|
|
|
}, |
638
|
|
|
|
639
|
|
|
_focusable: function( element ) { |
640
|
|
|
this.focusable = this.focusable.add( element ); |
641
|
|
|
this._on( element, { |
642
|
|
|
focusin: function( event ) { |
643
|
|
|
this._addClass( $( event.currentTarget ), null, "ui-state-focus" ); |
644
|
|
|
}, |
645
|
|
|
focusout: function( event ) { |
646
|
|
|
this._removeClass( $( event.currentTarget ), null, "ui-state-focus" ); |
647
|
|
|
} |
648
|
|
|
} ); |
649
|
|
|
}, |
650
|
|
|
|
651
|
|
|
_trigger: function( type, event, data ) { |
652
|
|
|
var prop, orig; |
653
|
|
|
var callback = this.options[ type ]; |
654
|
|
|
|
655
|
|
|
data = data || {}; |
656
|
|
|
event = $.Event( event ); |
657
|
|
|
event.type = ( type === this.widgetEventPrefix ? |
658
|
|
|
type : |
659
|
|
|
this.widgetEventPrefix + type ).toLowerCase(); |
660
|
|
|
|
661
|
|
|
// The original event may come from any element |
662
|
|
|
// so we need to reset the target on the new event |
663
|
|
|
event.target = this.element[ 0 ]; |
664
|
|
|
|
665
|
|
|
// Copy original event properties over to the new event |
666
|
|
|
orig = event.originalEvent; |
667
|
|
|
if ( orig ) { |
668
|
|
|
for ( prop in orig ) { |
669
|
|
|
if ( !( prop in event ) ) { |
670
|
|
|
event[ prop ] = orig[ prop ]; |
671
|
|
|
} |
672
|
|
|
} |
673
|
|
|
} |
674
|
|
|
|
675
|
|
|
this.element.trigger( event, data ); |
676
|
|
|
return !( $.isFunction( callback ) && |
677
|
|
|
callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false || |
678
|
|
|
event.isDefaultPrevented() ); |
679
|
|
|
} |
680
|
|
|
}; |
681
|
|
|
|
682
|
|
|
$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { |
683
|
|
|
$.Widget.prototype[ "_" + method ] = function( element, options, callback ) { |
684
|
|
|
if ( typeof options === "string" ) { |
685
|
|
|
options = { effect: options }; |
686
|
|
|
} |
687
|
|
|
|
688
|
|
|
var hasOptions; |
689
|
|
|
var effectName = !options ? |
690
|
|
|
method : |
691
|
|
|
options === true || typeof options === "number" ? |
692
|
|
|
defaultEffect : |
693
|
|
|
options.effect || defaultEffect; |
694
|
|
|
|
695
|
|
|
options = options || {}; |
696
|
|
|
if ( typeof options === "number" ) { |
697
|
|
|
options = { duration: options }; |
698
|
|
|
} |
699
|
|
|
|
700
|
|
|
hasOptions = !$.isEmptyObject( options ); |
701
|
|
|
options.complete = callback; |
702
|
|
|
|
703
|
|
|
if ( options.delay ) { |
704
|
|
|
element.delay( options.delay ); |
705
|
|
|
} |
706
|
|
|
|
707
|
|
|
if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { |
708
|
|
|
element[ method ]( options ); |
709
|
|
|
} else if ( effectName !== method && element[ effectName ] ) { |
710
|
|
|
element[ effectName ]( options.duration, options.easing, callback ); |
711
|
|
|
} else { |
712
|
|
|
element.queue( function( next ) { |
713
|
|
|
$( this )[ method ](); |
714
|
|
|
if ( callback ) { |
715
|
|
|
callback.call( element[ 0 ] ); |
716
|
|
|
} |
717
|
|
|
next(); |
718
|
|
|
} ); |
719
|
|
|
} |
720
|
|
|
}; |
721
|
|
|
} ); |
722
|
|
|
|
723
|
|
|
var widget = $.widget; |
724
|
|
|
|
725
|
|
|
|
726
|
|
|
/*! |
727
|
|
|
* jQuery UI :data 1.12.0 |
728
|
|
|
* http://jqueryui.com |
729
|
|
|
* |
730
|
|
|
* Copyright jQuery Foundation and other contributors |
731
|
|
|
* Released under the MIT license. |
732
|
|
|
* http://jquery.org/license |
733
|
|
|
*/ |
734
|
|
|
|
735
|
|
|
//>>label: :data Selector |
736
|
|
|
//>>group: Core |
737
|
|
|
//>>description: Selects elements which have data stored under the specified key. |
738
|
|
|
//>>docs: http://api.jqueryui.com/data-selector/ |
739
|
|
|
|
740
|
|
|
|
741
|
|
|
var data = $.extend( $.expr[ ":" ], { |
742
|
|
|
data: $.expr.createPseudo ? |
743
|
|
|
$.expr.createPseudo( function( dataName ) { |
744
|
|
|
return function( elem ) { |
745
|
|
|
return !!$.data( elem, dataName ); |
746
|
|
|
}; |
747
|
|
|
} ) : |
748
|
|
|
|
749
|
|
|
// Support: jQuery <1.8 |
750
|
|
|
function( elem, i, match ) { |
751
|
|
|
return !!$.data( elem, match[ 3 ] ); |
752
|
|
|
} |
753
|
|
|
} ); |
754
|
|
|
|
755
|
|
|
/*! |
756
|
|
|
* jQuery UI Disable Selection 1.12.0 |
757
|
|
|
* http://jqueryui.com |
758
|
|
|
* |
759
|
|
|
* Copyright jQuery Foundation and other contributors |
760
|
|
|
* Released under the MIT license. |
761
|
|
|
* http://jquery.org/license |
762
|
|
|
*/ |
763
|
|
|
|
764
|
|
|
//>>label: disableSelection |
765
|
|
|
//>>group: Core |
766
|
|
|
//>>description: Disable selection of text content within the set of matched elements. |
767
|
|
|
//>>docs: http://api.jqueryui.com/disableSelection/ |
768
|
|
|
|
769
|
|
|
// This file is deprecated |
770
|
|
|
|
771
|
|
|
|
772
|
|
|
var disableSelection = $.fn.extend( { |
773
|
|
|
disableSelection: ( function() { |
774
|
|
|
var eventType = "onselectstart" in document.createElement( "div" ) ? |
775
|
|
|
"selectstart" : |
776
|
|
|
"mousedown"; |
777
|
|
|
|
778
|
|
|
return function() { |
779
|
|
|
return this.on( eventType + ".ui-disableSelection", function( event ) { |
780
|
|
|
event.preventDefault(); |
781
|
|
|
} ); |
782
|
|
|
}; |
783
|
|
|
} )(), |
784
|
|
|
|
785
|
|
|
enableSelection: function() { |
786
|
|
|
return this.off( ".ui-disableSelection" ); |
787
|
|
|
} |
788
|
|
|
} ); |
789
|
|
|
|
790
|
|
|
|
791
|
|
|
/*! |
792
|
|
|
* jQuery UI Scroll Parent 1.12.0 |
793
|
|
|
* http://jqueryui.com |
794
|
|
|
* |
795
|
|
|
* Copyright jQuery Foundation and other contributors |
796
|
|
|
* Released under the MIT license. |
797
|
|
|
* http://jquery.org/license |
798
|
|
|
*/ |
799
|
|
|
|
800
|
|
|
//>>label: scrollParent |
801
|
|
|
//>>group: Core |
802
|
|
|
//>>description: Get the closest ancestor element that is scrollable. |
803
|
|
|
//>>docs: http://api.jqueryui.com/scrollParent/ |
804
|
|
|
|
805
|
|
|
|
806
|
|
|
|
807
|
|
|
var scrollParent = $.fn.scrollParent = function( includeHidden ) { |
808
|
|
|
var position = this.css( "position" ), |
809
|
|
|
excludeStaticParent = position === "absolute", |
810
|
|
|
overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, |
811
|
|
|
scrollParent = this.parents().filter( function() { |
812
|
|
|
var parent = $( this ); |
813
|
|
|
if ( excludeStaticParent && parent.css( "position" ) === "static" ) { |
814
|
|
|
return false; |
815
|
|
|
} |
816
|
|
|
return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + |
817
|
|
|
parent.css( "overflow-x" ) ); |
818
|
|
|
} ).eq( 0 ); |
819
|
|
|
|
820
|
|
|
return position === "fixed" || !scrollParent.length ? |
821
|
|
|
$( this[ 0 ].ownerDocument || document ) : |
822
|
|
|
scrollParent; |
823
|
|
|
}; |
824
|
|
|
|
825
|
|
|
|
826
|
|
|
|
827
|
|
|
|
828
|
|
|
// This file is deprecated |
829
|
|
|
var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); |
|
|
|
|
830
|
|
|
|
831
|
|
|
/*! |
832
|
|
|
* jQuery UI Mouse 1.12.0 |
833
|
|
|
* http://jqueryui.com |
834
|
|
|
* |
835
|
|
|
* Copyright jQuery Foundation and other contributors |
836
|
|
|
* Released under the MIT license. |
837
|
|
|
* http://jquery.org/license |
838
|
|
|
*/ |
839
|
|
|
|
840
|
|
|
//>>label: Mouse |
841
|
|
|
//>>group: Widgets |
842
|
|
|
//>>description: Abstracts mouse-based interactions to assist in creating certain widgets. |
843
|
|
|
//>>docs: http://api.jqueryui.com/mouse/ |
844
|
|
|
|
845
|
|
|
|
846
|
|
|
|
847
|
|
|
var mouseHandled = false; |
848
|
|
|
$( document ).on( "mouseup", function() { |
849
|
|
|
mouseHandled = false; |
850
|
|
|
} ); |
851
|
|
|
|
852
|
|
|
var widgetsMouse = $.widget( "ui.mouse", { |
|
|
|
|
853
|
|
|
version: "1.12.0", |
854
|
|
|
options: { |
855
|
|
|
cancel: "input, textarea, button, select, option", |
856
|
|
|
distance: 1, |
857
|
|
|
delay: 0 |
858
|
|
|
}, |
859
|
|
|
_mouseInit: function() { |
860
|
|
|
var that = this; |
861
|
|
|
|
862
|
|
|
this.element |
863
|
|
|
.on( "mousedown." + this.widgetName, function( event ) { |
864
|
|
|
return that._mouseDown( event ); |
865
|
|
|
} ) |
866
|
|
|
.on( "click." + this.widgetName, function( event ) { |
867
|
|
|
if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) { |
|
|
|
|
868
|
|
|
$.removeData( event.target, that.widgetName + ".preventClickEvent" ); |
869
|
|
|
event.stopImmediatePropagation(); |
870
|
|
|
return false; |
871
|
|
|
} |
872
|
|
|
} ); |
873
|
|
|
|
874
|
|
|
this.started = false; |
875
|
|
|
}, |
876
|
|
|
|
877
|
|
|
// TODO: make sure destroying one instance of mouse doesn't mess with |
878
|
|
|
// other instances of mouse |
879
|
|
|
_mouseDestroy: function() { |
880
|
|
|
this.element.off( "." + this.widgetName ); |
881
|
|
|
if ( this._mouseMoveDelegate ) { |
882
|
|
|
this.document |
883
|
|
|
.off( "mousemove." + this.widgetName, this._mouseMoveDelegate ) |
884
|
|
|
.off( "mouseup." + this.widgetName, this._mouseUpDelegate ); |
885
|
|
|
} |
886
|
|
|
}, |
887
|
|
|
|
888
|
|
|
_mouseDown: function( event ) { |
889
|
|
|
|
890
|
|
|
// don't let more than one widget handle mouseStart |
891
|
|
|
if ( mouseHandled ) { |
892
|
|
|
return; |
|
|
|
|
893
|
|
|
} |
894
|
|
|
|
895
|
|
|
this._mouseMoved = false; |
896
|
|
|
|
897
|
|
|
// We may have missed mouseup (out of window) |
898
|
|
|
( this._mouseStarted && this._mouseUp( event ) ); |
899
|
|
|
|
900
|
|
|
this._mouseDownEvent = event; |
901
|
|
|
|
902
|
|
|
var that = this, |
903
|
|
|
btnIsLeft = ( event.which === 1 ), |
904
|
|
|
|
905
|
|
|
// event.target.nodeName works around a bug in IE 8 with |
906
|
|
|
// disabled inputs (#7620) |
907
|
|
|
elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ? |
908
|
|
|
$( event.target ).closest( this.options.cancel ).length : false ); |
909
|
|
|
if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) { |
910
|
|
|
return true; |
911
|
|
|
} |
912
|
|
|
|
913
|
|
|
this.mouseDelayMet = !this.options.delay; |
914
|
|
|
if ( !this.mouseDelayMet ) { |
915
|
|
|
this._mouseDelayTimer = setTimeout( function() { |
916
|
|
|
that.mouseDelayMet = true; |
917
|
|
|
}, this.options.delay ); |
918
|
|
|
} |
919
|
|
|
|
920
|
|
|
if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) { |
921
|
|
|
this._mouseStarted = ( this._mouseStart( event ) !== false ); |
922
|
|
|
if ( !this._mouseStarted ) { |
923
|
|
|
event.preventDefault(); |
924
|
|
|
return true; |
925
|
|
|
} |
926
|
|
|
} |
927
|
|
|
|
928
|
|
|
// Click event may never have fired (Gecko & Opera) |
929
|
|
|
if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) { |
930
|
|
|
$.removeData( event.target, this.widgetName + ".preventClickEvent" ); |
931
|
|
|
} |
932
|
|
|
|
933
|
|
|
// These delegates are required to keep context |
934
|
|
|
this._mouseMoveDelegate = function( event ) { |
935
|
|
|
return that._mouseMove( event ); |
936
|
|
|
}; |
937
|
|
|
this._mouseUpDelegate = function( event ) { |
938
|
|
|
return that._mouseUp( event ); |
939
|
|
|
}; |
940
|
|
|
|
941
|
|
|
this.document |
942
|
|
|
.on( "mousemove." + this.widgetName, this._mouseMoveDelegate ) |
943
|
|
|
.on( "mouseup." + this.widgetName, this._mouseUpDelegate ); |
944
|
|
|
|
945
|
|
|
event.preventDefault(); |
946
|
|
|
|
947
|
|
|
mouseHandled = true; |
948
|
|
|
return true; |
949
|
|
|
}, |
950
|
|
|
|
951
|
|
|
_mouseMove: function( event ) { |
952
|
|
|
|
953
|
|
|
// Only check for mouseups outside the document if you've moved inside the document |
954
|
|
|
// at least once. This prevents the firing of mouseup in the case of IE<9, which will |
955
|
|
|
// fire a mousemove event if content is placed under the cursor. See #7778 |
956
|
|
|
// Support: IE <9 |
957
|
|
|
if ( this._mouseMoved ) { |
958
|
|
|
|
959
|
|
|
// IE mouseup check - mouseup happened when mouse was out of window |
960
|
|
|
if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && |
961
|
|
|
!event.button ) { |
962
|
|
|
return this._mouseUp( event ); |
963
|
|
|
|
964
|
|
|
// Iframe mouseup check - mouseup occurred in another document |
965
|
|
|
} else if ( !event.which ) { |
966
|
|
|
|
967
|
|
|
// Support: Safari <=8 - 9 |
968
|
|
|
// Safari sets which to 0 if you press any of the following keys |
969
|
|
|
// during a drag (#14461) |
970
|
|
|
if ( event.originalEvent.altKey || event.originalEvent.ctrlKey || |
971
|
|
|
event.originalEvent.metaKey || event.originalEvent.shiftKey ) { |
972
|
|
|
this.ignoreMissingWhich = true; |
973
|
|
|
} else if ( !this.ignoreMissingWhich ) { |
974
|
|
|
return this._mouseUp( event ); |
975
|
|
|
} |
976
|
|
|
} |
977
|
|
|
} |
978
|
|
|
|
979
|
|
|
if ( event.which || event.button ) { |
980
|
|
|
this._mouseMoved = true; |
981
|
|
|
} |
982
|
|
|
|
983
|
|
|
if ( this._mouseStarted ) { |
984
|
|
|
this._mouseDrag( event ); |
985
|
|
|
return event.preventDefault(); |
986
|
|
|
} |
987
|
|
|
|
988
|
|
|
if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) { |
989
|
|
|
this._mouseStarted = |
990
|
|
|
( this._mouseStart( this._mouseDownEvent, event ) !== false ); |
991
|
|
|
( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) ); |
992
|
|
|
} |
993
|
|
|
|
994
|
|
|
return !this._mouseStarted; |
995
|
|
|
}, |
996
|
|
|
|
997
|
|
|
_mouseUp: function( event ) { |
998
|
|
|
this.document |
999
|
|
|
.off( "mousemove." + this.widgetName, this._mouseMoveDelegate ) |
1000
|
|
|
.off( "mouseup." + this.widgetName, this._mouseUpDelegate ); |
1001
|
|
|
|
1002
|
|
|
if ( this._mouseStarted ) { |
1003
|
|
|
this._mouseStarted = false; |
1004
|
|
|
|
1005
|
|
|
if ( event.target === this._mouseDownEvent.target ) { |
1006
|
|
|
$.data( event.target, this.widgetName + ".preventClickEvent", true ); |
1007
|
|
|
} |
1008
|
|
|
|
1009
|
|
|
this._mouseStop( event ); |
1010
|
|
|
} |
1011
|
|
|
|
1012
|
|
|
if ( this._mouseDelayTimer ) { |
1013
|
|
|
clearTimeout( this._mouseDelayTimer ); |
1014
|
|
|
delete this._mouseDelayTimer; |
1015
|
|
|
} |
1016
|
|
|
|
1017
|
|
|
this.ignoreMissingWhich = false; |
1018
|
|
|
mouseHandled = false; |
1019
|
|
|
event.preventDefault(); |
1020
|
|
|
}, |
1021
|
|
|
|
1022
|
|
|
_mouseDistanceMet: function( event ) { |
1023
|
|
|
return ( Math.max( |
1024
|
|
|
Math.abs( this._mouseDownEvent.pageX - event.pageX ), |
1025
|
|
|
Math.abs( this._mouseDownEvent.pageY - event.pageY ) |
1026
|
|
|
) >= this.options.distance |
1027
|
|
|
); |
1028
|
|
|
}, |
1029
|
|
|
|
1030
|
|
|
_mouseDelayMet: function( /* event */ ) { |
1031
|
|
|
return this.mouseDelayMet; |
1032
|
|
|
}, |
1033
|
|
|
|
1034
|
|
|
// These are placeholder methods, to be overriden by extending plugin |
1035
|
|
|
_mouseStart: function( /* event */ ) {}, |
1036
|
|
|
_mouseDrag: function( /* event */ ) {}, |
1037
|
|
|
_mouseStop: function( /* event */ ) {}, |
1038
|
|
|
_mouseCapture: function( /* event */ ) { return true; } |
1039
|
|
|
} ); |
1040
|
|
|
|
1041
|
|
|
|
1042
|
|
|
|
1043
|
|
|
|
1044
|
|
|
// $.ui.plugin is deprecated. Use $.widget() extensions instead. |
1045
|
|
|
var plugin = $.ui.plugin = { |
1046
|
|
|
add: function( module, option, set ) { |
1047
|
|
|
var i, |
1048
|
|
|
proto = $.ui[ module ].prototype; |
1049
|
|
|
for ( i in set ) { |
1050
|
|
|
proto.plugins[ i ] = proto.plugins[ i ] || []; |
1051
|
|
|
proto.plugins[ i ].push( [ option, set[ i ] ] ); |
1052
|
|
|
} |
1053
|
|
|
}, |
1054
|
|
|
call: function( instance, name, args, allowDisconnected ) { |
1055
|
|
|
var i, |
1056
|
|
|
set = instance.plugins[ name ]; |
1057
|
|
|
|
1058
|
|
|
if ( !set ) { |
1059
|
|
|
return; |
1060
|
|
|
} |
1061
|
|
|
|
1062
|
|
|
if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || |
1063
|
|
|
instance.element[ 0 ].parentNode.nodeType === 11 ) ) { |
1064
|
|
|
return; |
1065
|
|
|
} |
1066
|
|
|
|
1067
|
|
|
for ( i = 0; i < set.length; i++ ) { |
1068
|
|
|
if ( instance.options[ set[ i ][ 0 ] ] ) { |
1069
|
|
|
set[ i ][ 1 ].apply( instance.element, args ); |
1070
|
|
|
} |
1071
|
|
|
} |
1072
|
|
|
} |
1073
|
|
|
}; |
1074
|
|
|
|
1075
|
|
|
|
1076
|
|
|
|
1077
|
|
|
var safeActiveElement = $.ui.safeActiveElement = function( document ) { |
1078
|
|
|
var activeElement; |
1079
|
|
|
|
1080
|
|
|
// Support: IE 9 only |
1081
|
|
|
// IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe> |
1082
|
|
|
try { |
1083
|
|
|
activeElement = document.activeElement; |
1084
|
|
|
} catch ( error ) { |
1085
|
|
|
activeElement = document.body; |
1086
|
|
|
} |
1087
|
|
|
|
1088
|
|
|
// Support: IE 9 - 11 only |
1089
|
|
|
// IE may return null instead of an element |
1090
|
|
|
// Interestingly, this only seems to occur when NOT in an iframe |
1091
|
|
|
if ( !activeElement ) { |
1092
|
|
|
activeElement = document.body; |
1093
|
|
|
} |
1094
|
|
|
|
1095
|
|
|
// Support: IE 11 only |
1096
|
|
|
// IE11 returns a seemingly empty object in some cases when accessing |
1097
|
|
|
// document.activeElement from an <iframe> |
1098
|
|
|
if ( !activeElement.nodeName ) { |
1099
|
|
|
activeElement = document.body; |
1100
|
|
|
} |
1101
|
|
|
|
1102
|
|
|
return activeElement; |
1103
|
|
|
}; |
1104
|
|
|
|
1105
|
|
|
|
1106
|
|
|
|
1107
|
|
|
var safeBlur = $.ui.safeBlur = function( element ) { |
1108
|
|
|
|
1109
|
|
|
// Support: IE9 - 10 only |
1110
|
|
|
// If the <body> is blurred, IE will switch windows, see #9420 |
1111
|
|
|
if ( element && element.nodeName.toLowerCase() !== "body" ) { |
1112
|
|
|
$( element ).trigger( "blur" ); |
1113
|
|
|
} |
1114
|
|
|
}; |
1115
|
|
|
|
1116
|
|
|
|
1117
|
|
|
/*! |
1118
|
|
|
* jQuery UI Draggable 1.12.0 |
1119
|
|
|
* http://jqueryui.com |
1120
|
|
|
* |
1121
|
|
|
* Copyright jQuery Foundation and other contributors |
1122
|
|
|
* Released under the MIT license. |
1123
|
|
|
* http://jquery.org/license |
1124
|
|
|
*/ |
1125
|
|
|
|
1126
|
|
|
//>>label: Draggable |
1127
|
|
|
//>>group: Interactions |
1128
|
|
|
//>>description: Enables dragging functionality for any element. |
1129
|
|
|
//>>docs: http://api.jqueryui.com/draggable/ |
1130
|
|
|
//>>demos: http://jqueryui.com/draggable/ |
1131
|
|
|
//>>css.structure: ../../themes/base/draggable.css |
1132
|
|
|
|
1133
|
|
|
|
1134
|
|
|
|
1135
|
|
|
$.widget( "ui.draggable", $.ui.mouse, { |
1136
|
|
|
version: "1.12.0", |
1137
|
|
|
widgetEventPrefix: "drag", |
1138
|
|
|
options: { |
1139
|
|
|
addClasses: true, |
1140
|
|
|
appendTo: "parent", |
1141
|
|
|
axis: false, |
1142
|
|
|
connectToSortable: false, |
1143
|
|
|
containment: false, |
1144
|
|
|
cursor: "auto", |
1145
|
|
|
cursorAt: false, |
1146
|
|
|
grid: false, |
1147
|
|
|
handle: false, |
1148
|
|
|
helper: "original", |
1149
|
|
|
iframeFix: false, |
1150
|
|
|
opacity: false, |
1151
|
|
|
refreshPositions: false, |
1152
|
|
|
revert: false, |
1153
|
|
|
revertDuration: 500, |
1154
|
|
|
scope: "default", |
1155
|
|
|
scroll: true, |
1156
|
|
|
scrollSensitivity: 20, |
1157
|
|
|
scrollSpeed: 20, |
1158
|
|
|
snap: false, |
1159
|
|
|
snapMode: "both", |
1160
|
|
|
snapTolerance: 20, |
1161
|
|
|
stack: false, |
1162
|
|
|
zIndex: false, |
1163
|
|
|
|
1164
|
|
|
// Callbacks |
1165
|
|
|
drag: null, |
1166
|
|
|
start: null, |
1167
|
|
|
stop: null |
1168
|
|
|
}, |
1169
|
|
|
_create: function() { |
1170
|
|
|
|
1171
|
|
|
if ( this.options.helper === "original" ) { |
1172
|
|
|
this._setPositionRelative(); |
1173
|
|
|
} |
1174
|
|
|
if ( this.options.addClasses ) { |
1175
|
|
|
this._addClass( "ui-draggable" ); |
1176
|
|
|
} |
1177
|
|
|
this._setHandleClassName(); |
1178
|
|
|
|
1179
|
|
|
this._mouseInit(); |
1180
|
|
|
}, |
1181
|
|
|
|
1182
|
|
|
_setOption: function( key, value ) { |
1183
|
|
|
this._super( key, value ); |
1184
|
|
|
if ( key === "handle" ) { |
1185
|
|
|
this._removeHandleClassName(); |
1186
|
|
|
this._setHandleClassName(); |
1187
|
|
|
} |
1188
|
|
|
}, |
1189
|
|
|
|
1190
|
|
|
_destroy: function() { |
1191
|
|
|
if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) { |
1192
|
|
|
this.destroyOnClear = true; |
1193
|
|
|
return; |
1194
|
|
|
} |
1195
|
|
|
this._removeHandleClassName(); |
1196
|
|
|
this._mouseDestroy(); |
1197
|
|
|
}, |
1198
|
|
|
|
1199
|
|
|
_mouseCapture: function( event ) { |
1200
|
|
|
var o = this.options; |
1201
|
|
|
|
1202
|
|
|
this._blurActiveElement( event ); |
1203
|
|
|
|
1204
|
|
|
// Among others, prevent a drag on a resizable-handle |
1205
|
|
|
if ( this.helper || o.disabled || |
1206
|
|
|
$( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) { |
1207
|
|
|
return false; |
1208
|
|
|
} |
1209
|
|
|
|
1210
|
|
|
//Quit if we're not on a valid handle |
1211
|
|
|
this.handle = this._getHandle( event ); |
1212
|
|
|
if ( !this.handle ) { |
1213
|
|
|
return false; |
1214
|
|
|
} |
1215
|
|
|
|
1216
|
|
|
this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix ); |
1217
|
|
|
|
1218
|
|
|
return true; |
1219
|
|
|
|
1220
|
|
|
}, |
1221
|
|
|
|
1222
|
|
|
_blockFrames: function( selector ) { |
1223
|
|
|
this.iframeBlocks = this.document.find( selector ).map( function() { |
1224
|
|
|
var iframe = $( this ); |
1225
|
|
|
|
1226
|
|
|
return $( "<div>" ) |
1227
|
|
|
.css( "position", "absolute" ) |
1228
|
|
|
.appendTo( iframe.parent() ) |
1229
|
|
|
.outerWidth( iframe.outerWidth() ) |
1230
|
|
|
.outerHeight( iframe.outerHeight() ) |
1231
|
|
|
.offset( iframe.offset() )[ 0 ]; |
1232
|
|
|
} ); |
1233
|
|
|
}, |
1234
|
|
|
|
1235
|
|
|
_unblockFrames: function() { |
1236
|
|
|
if ( this.iframeBlocks ) { |
1237
|
|
|
this.iframeBlocks.remove(); |
1238
|
|
|
delete this.iframeBlocks; |
1239
|
|
|
} |
1240
|
|
|
}, |
1241
|
|
|
|
1242
|
|
|
_blurActiveElement: function( event ) { |
1243
|
|
|
var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ), |
1244
|
|
|
target = $( event.target ); |
1245
|
|
|
|
1246
|
|
|
// Only blur if the event occurred on an element that is: |
1247
|
|
|
// 1) within the draggable handle |
1248
|
|
|
// 2) but not within the currently focused element |
1249
|
|
|
// See #10527, #12472 |
1250
|
|
|
if ( this._getHandle( event ) && target.closest( activeElement ).length ) { |
1251
|
|
|
return; |
1252
|
|
|
} |
1253
|
|
|
|
1254
|
|
|
// Blur any element that currently has focus, see #4261 |
1255
|
|
|
$.ui.safeBlur( activeElement ); |
1256
|
|
|
}, |
1257
|
|
|
|
1258
|
|
|
_mouseStart: function( event ) { |
1259
|
|
|
|
1260
|
|
|
var o = this.options; |
1261
|
|
|
|
1262
|
|
|
//Create and append the visible helper |
1263
|
|
|
this.helper = this._createHelper( event ); |
1264
|
|
|
|
1265
|
|
|
this._addClass( this.helper, "ui-draggable-dragging" ); |
1266
|
|
|
|
1267
|
|
|
//Cache the helper size |
1268
|
|
|
this._cacheHelperProportions(); |
1269
|
|
|
|
1270
|
|
|
//If ddmanager is used for droppables, set the global draggable |
1271
|
|
|
if ( $.ui.ddmanager ) { |
1272
|
|
|
$.ui.ddmanager.current = this; |
1273
|
|
|
} |
1274
|
|
|
|
1275
|
|
|
/* |
1276
|
|
|
* - Position generation - |
1277
|
|
|
* This block generates everything position related - it's the core of draggables. |
1278
|
|
|
*/ |
1279
|
|
|
|
1280
|
|
|
//Cache the margins of the original element |
1281
|
|
|
this._cacheMargins(); |
1282
|
|
|
|
1283
|
|
|
//Store the helper's css position |
1284
|
|
|
this.cssPosition = this.helper.css( "position" ); |
1285
|
|
|
this.scrollParent = this.helper.scrollParent( true ); |
1286
|
|
|
this.offsetParent = this.helper.offsetParent(); |
1287
|
|
|
this.hasFixedAncestor = this.helper.parents().filter( function() { |
1288
|
|
|
return $( this ).css( "position" ) === "fixed"; |
1289
|
|
|
} ).length > 0; |
1290
|
|
|
|
1291
|
|
|
//The element's absolute position on the page minus margins |
1292
|
|
|
this.positionAbs = this.element.offset(); |
1293
|
|
|
this._refreshOffsets( event ); |
1294
|
|
|
|
1295
|
|
|
//Generate the original position |
1296
|
|
|
this.originalPosition = this.position = this._generatePosition( event, false ); |
1297
|
|
|
this.originalPageX = event.pageX; |
1298
|
|
|
this.originalPageY = event.pageY; |
1299
|
|
|
|
1300
|
|
|
//Adjust the mouse offset relative to the helper if "cursorAt" is supplied |
1301
|
|
|
( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) ); |
1302
|
|
|
|
1303
|
|
|
//Set a containment if given in the options |
1304
|
|
|
this._setContainment(); |
1305
|
|
|
|
1306
|
|
|
//Trigger event + callbacks |
1307
|
|
|
if ( this._trigger( "start", event ) === false ) { |
1308
|
|
|
this._clear(); |
1309
|
|
|
return false; |
1310
|
|
|
} |
1311
|
|
|
|
1312
|
|
|
//Recache the helper size |
1313
|
|
|
this._cacheHelperProportions(); |
1314
|
|
|
|
1315
|
|
|
//Prepare the droppable offsets |
1316
|
|
|
if ( $.ui.ddmanager && !o.dropBehaviour ) { |
1317
|
|
|
$.ui.ddmanager.prepareOffsets( this, event ); |
1318
|
|
|
} |
1319
|
|
|
|
1320
|
|
|
// Execute the drag once - this causes the helper not to be visible before getting its |
1321
|
|
|
// correct position |
1322
|
|
|
this._mouseDrag( event, true ); |
1323
|
|
|
|
1324
|
|
|
// If the ddmanager is used for droppables, inform the manager that dragging has started |
1325
|
|
|
// (see #5003) |
1326
|
|
|
if ( $.ui.ddmanager ) { |
1327
|
|
|
$.ui.ddmanager.dragStart( this, event ); |
1328
|
|
|
} |
1329
|
|
|
|
1330
|
|
|
return true; |
1331
|
|
|
}, |
1332
|
|
|
|
1333
|
|
|
_refreshOffsets: function( event ) { |
1334
|
|
|
this.offset = { |
1335
|
|
|
top: this.positionAbs.top - this.margins.top, |
1336
|
|
|
left: this.positionAbs.left - this.margins.left, |
1337
|
|
|
scroll: false, |
1338
|
|
|
parent: this._getParentOffset(), |
1339
|
|
|
relative: this._getRelativeOffset() |
1340
|
|
|
}; |
1341
|
|
|
|
1342
|
|
|
this.offset.click = { |
1343
|
|
|
left: event.pageX - this.offset.left, |
1344
|
|
|
top: event.pageY - this.offset.top |
1345
|
|
|
}; |
1346
|
|
|
}, |
1347
|
|
|
|
1348
|
|
|
_mouseDrag: function( event, noPropagation ) { |
1349
|
|
|
|
1350
|
|
|
// reset any necessary cached properties (see #5009) |
1351
|
|
|
if ( this.hasFixedAncestor ) { |
1352
|
|
|
this.offset.parent = this._getParentOffset(); |
1353
|
|
|
} |
1354
|
|
|
|
1355
|
|
|
//Compute the helpers position |
1356
|
|
|
this.position = this._generatePosition( event, true ); |
1357
|
|
|
this.positionAbs = this._convertPositionTo( "absolute" ); |
1358
|
|
|
|
1359
|
|
|
//Call plugins and callbacks and use the resulting position if something is returned |
1360
|
|
|
if ( !noPropagation ) { |
1361
|
|
|
var ui = this._uiHash(); |
1362
|
|
|
if ( this._trigger( "drag", event, ui ) === false ) { |
1363
|
|
|
this._mouseUp( new $.Event( "mouseup", event ) ); |
1364
|
|
|
return false; |
1365
|
|
|
} |
1366
|
|
|
this.position = ui.position; |
1367
|
|
|
} |
1368
|
|
|
|
1369
|
|
|
this.helper[ 0 ].style.left = this.position.left + "px"; |
1370
|
|
|
this.helper[ 0 ].style.top = this.position.top + "px"; |
1371
|
|
|
|
1372
|
|
|
if ( $.ui.ddmanager ) { |
1373
|
|
|
$.ui.ddmanager.drag( this, event ); |
1374
|
|
|
} |
1375
|
|
|
|
1376
|
|
|
return false; |
1377
|
|
|
}, |
1378
|
|
|
|
1379
|
|
|
_mouseStop: function( event ) { |
1380
|
|
|
|
1381
|
|
|
//If we are using droppables, inform the manager about the drop |
1382
|
|
|
var that = this, |
1383
|
|
|
dropped = false; |
1384
|
|
|
if ( $.ui.ddmanager && !this.options.dropBehaviour ) { |
1385
|
|
|
dropped = $.ui.ddmanager.drop( this, event ); |
1386
|
|
|
} |
1387
|
|
|
|
1388
|
|
|
//if a drop comes from outside (a sortable) |
1389
|
|
|
if ( this.dropped ) { |
1390
|
|
|
dropped = this.dropped; |
1391
|
|
|
this.dropped = false; |
1392
|
|
|
} |
1393
|
|
|
|
1394
|
|
|
if ( ( this.options.revert === "invalid" && !dropped ) || |
1395
|
|
|
( this.options.revert === "valid" && dropped ) || |
1396
|
|
|
this.options.revert === true || ( $.isFunction( this.options.revert ) && |
1397
|
|
|
this.options.revert.call( this.element, dropped ) ) |
1398
|
|
|
) { |
1399
|
|
|
$( this.helper ).animate( |
1400
|
|
|
this.originalPosition, |
1401
|
|
|
parseInt( this.options.revertDuration, 10 ), |
1402
|
|
|
function() { |
1403
|
|
|
if ( that._trigger( "stop", event ) !== false ) { |
1404
|
|
|
that._clear(); |
1405
|
|
|
} |
1406
|
|
|
} |
1407
|
|
|
); |
1408
|
|
|
} else { |
1409
|
|
|
if ( this._trigger( "stop", event ) !== false ) { |
1410
|
|
|
this._clear(); |
1411
|
|
|
} |
1412
|
|
|
} |
1413
|
|
|
|
1414
|
|
|
return false; |
1415
|
|
|
}, |
1416
|
|
|
|
1417
|
|
|
_mouseUp: function( event ) { |
1418
|
|
|
this._unblockFrames(); |
1419
|
|
|
|
1420
|
|
|
// If the ddmanager is used for droppables, inform the manager that dragging has stopped |
1421
|
|
|
// (see #5003) |
1422
|
|
|
if ( $.ui.ddmanager ) { |
1423
|
|
|
$.ui.ddmanager.dragStop( this, event ); |
1424
|
|
|
} |
1425
|
|
|
|
1426
|
|
|
// Only need to focus if the event occurred on the draggable itself, see #10527 |
1427
|
|
|
if ( this.handleElement.is( event.target ) ) { |
1428
|
|
|
|
1429
|
|
|
// The interaction is over; whether or not the click resulted in a drag, |
1430
|
|
|
// focus the element |
1431
|
|
|
this.element.trigger( "focus" ); |
1432
|
|
|
} |
1433
|
|
|
|
1434
|
|
|
return $.ui.mouse.prototype._mouseUp.call( this, event ); |
1435
|
|
|
}, |
1436
|
|
|
|
1437
|
|
|
cancel: function() { |
1438
|
|
|
|
1439
|
|
|
if ( this.helper.is( ".ui-draggable-dragging" ) ) { |
1440
|
|
|
this._mouseUp( new $.Event( "mouseup", { target: this.element[ 0 ] } ) ); |
1441
|
|
|
} else { |
1442
|
|
|
this._clear(); |
1443
|
|
|
} |
1444
|
|
|
|
1445
|
|
|
return this; |
1446
|
|
|
|
1447
|
|
|
}, |
1448
|
|
|
|
1449
|
|
|
_getHandle: function( event ) { |
1450
|
|
|
return this.options.handle ? |
1451
|
|
|
!!$( event.target ).closest( this.element.find( this.options.handle ) ).length : |
1452
|
|
|
true; |
1453
|
|
|
}, |
1454
|
|
|
|
1455
|
|
|
_setHandleClassName: function() { |
1456
|
|
|
this.handleElement = this.options.handle ? |
1457
|
|
|
this.element.find( this.options.handle ) : this.element; |
1458
|
|
|
this._addClass( this.handleElement, "ui-draggable-handle" ); |
1459
|
|
|
}, |
1460
|
|
|
|
1461
|
|
|
_removeHandleClassName: function() { |
1462
|
|
|
this._removeClass( this.handleElement, "ui-draggable-handle" ); |
1463
|
|
|
}, |
1464
|
|
|
|
1465
|
|
|
_createHelper: function( event ) { |
1466
|
|
|
|
1467
|
|
|
var o = this.options, |
1468
|
|
|
helperIsFunction = $.isFunction( o.helper ), |
1469
|
|
|
helper = helperIsFunction ? |
1470
|
|
|
$( o.helper.apply( this.element[ 0 ], [ event ] ) ) : |
1471
|
|
|
( o.helper === "clone" ? |
1472
|
|
|
this.element.clone().removeAttr( "id" ) : |
1473
|
|
|
this.element ); |
1474
|
|
|
|
1475
|
|
|
if ( !helper.parents( "body" ).length ) { |
1476
|
|
|
helper.appendTo( ( o.appendTo === "parent" ? |
1477
|
|
|
this.element[ 0 ].parentNode : |
1478
|
|
|
o.appendTo ) ); |
1479
|
|
|
} |
1480
|
|
|
|
1481
|
|
|
// Http://bugs.jqueryui.com/ticket/9446 |
1482
|
|
|
// a helper function can return the original element |
1483
|
|
|
// which wouldn't have been set to relative in _create |
1484
|
|
|
if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) { |
1485
|
|
|
this._setPositionRelative(); |
1486
|
|
|
} |
1487
|
|
|
|
1488
|
|
|
if ( helper[ 0 ] !== this.element[ 0 ] && |
1489
|
|
|
!( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) { |
1490
|
|
|
helper.css( "position", "absolute" ); |
1491
|
|
|
} |
1492
|
|
|
|
1493
|
|
|
return helper; |
1494
|
|
|
|
1495
|
|
|
}, |
1496
|
|
|
|
1497
|
|
|
_setPositionRelative: function() { |
1498
|
|
|
if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) { |
1499
|
|
|
this.element[ 0 ].style.position = "relative"; |
1500
|
|
|
} |
1501
|
|
|
}, |
1502
|
|
|
|
1503
|
|
View Code Duplication |
_adjustOffsetFromHelper: function( obj ) { |
|
|
|
|
1504
|
|
|
if ( typeof obj === "string" ) { |
1505
|
|
|
obj = obj.split( " " ); |
1506
|
|
|
} |
1507
|
|
|
if ( $.isArray( obj ) ) { |
1508
|
|
|
obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 }; |
1509
|
|
|
} |
1510
|
|
|
if ( "left" in obj ) { |
1511
|
|
|
this.offset.click.left = obj.left + this.margins.left; |
1512
|
|
|
} |
1513
|
|
|
if ( "right" in obj ) { |
1514
|
|
|
this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; |
1515
|
|
|
} |
1516
|
|
|
if ( "top" in obj ) { |
1517
|
|
|
this.offset.click.top = obj.top + this.margins.top; |
1518
|
|
|
} |
1519
|
|
|
if ( "bottom" in obj ) { |
1520
|
|
|
this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; |
1521
|
|
|
} |
1522
|
|
|
}, |
1523
|
|
|
|
1524
|
|
|
_isRootNode: function( element ) { |
1525
|
|
|
return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ]; |
1526
|
|
|
}, |
1527
|
|
|
|
1528
|
|
|
_getParentOffset: function() { |
1529
|
|
|
|
1530
|
|
|
//Get the offsetParent and cache its position |
1531
|
|
|
var po = this.offsetParent.offset(), |
1532
|
|
|
document = this.document[ 0 ]; |
1533
|
|
|
|
1534
|
|
|
// This is a special case where we need to modify a offset calculated on start, since the |
1535
|
|
|
// following happened: |
1536
|
|
|
// 1. The position of the helper is absolute, so it's position is calculated based on the |
1537
|
|
|
// next positioned parent |
1538
|
|
|
// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't |
1539
|
|
|
// the document, which means that the scroll is included in the initial calculation of the |
1540
|
|
|
// offset of the parent, and never recalculated upon drag |
1541
|
|
|
if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== document && |
1542
|
|
|
$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) { |
1543
|
|
|
po.left += this.scrollParent.scrollLeft(); |
1544
|
|
|
po.top += this.scrollParent.scrollTop(); |
1545
|
|
|
} |
1546
|
|
|
|
1547
|
|
|
if ( this._isRootNode( this.offsetParent[ 0 ] ) ) { |
1548
|
|
|
po = { top: 0, left: 0 }; |
1549
|
|
|
} |
1550
|
|
|
|
1551
|
|
|
return { |
1552
|
|
|
top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ), |
1553
|
|
|
left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 ) |
1554
|
|
|
}; |
1555
|
|
|
|
1556
|
|
|
}, |
1557
|
|
|
|
1558
|
|
|
_getRelativeOffset: function() { |
1559
|
|
|
if ( this.cssPosition !== "relative" ) { |
1560
|
|
|
return { top: 0, left: 0 }; |
1561
|
|
|
} |
1562
|
|
|
|
1563
|
|
|
var p = this.element.position(), |
1564
|
|
|
scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ); |
1565
|
|
|
|
1566
|
|
|
return { |
1567
|
|
|
top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) + |
1568
|
|
|
( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ), |
1569
|
|
|
left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) + |
1570
|
|
|
( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 ) |
1571
|
|
|
}; |
1572
|
|
|
|
1573
|
|
|
}, |
1574
|
|
|
|
1575
|
|
|
_cacheMargins: function() { |
1576
|
|
|
this.margins = { |
1577
|
|
|
left: ( parseInt( this.element.css( "marginLeft" ), 10 ) || 0 ), |
1578
|
|
|
top: ( parseInt( this.element.css( "marginTop" ), 10 ) || 0 ), |
1579
|
|
|
right: ( parseInt( this.element.css( "marginRight" ), 10 ) || 0 ), |
1580
|
|
|
bottom: ( parseInt( this.element.css( "marginBottom" ), 10 ) || 0 ) |
1581
|
|
|
}; |
1582
|
|
|
}, |
1583
|
|
|
|
1584
|
|
|
_cacheHelperProportions: function() { |
1585
|
|
|
this.helperProportions = { |
1586
|
|
|
width: this.helper.outerWidth(), |
1587
|
|
|
height: this.helper.outerHeight() |
1588
|
|
|
}; |
1589
|
|
|
}, |
1590
|
|
|
|
1591
|
|
|
_setContainment: function() { |
1592
|
|
|
|
1593
|
|
|
var isUserScrollable, c, ce, |
1594
|
|
|
o = this.options, |
1595
|
|
|
document = this.document[ 0 ]; |
1596
|
|
|
|
1597
|
|
|
this.relativeContainer = null; |
1598
|
|
|
|
1599
|
|
|
if ( !o.containment ) { |
1600
|
|
|
this.containment = null; |
1601
|
|
|
return; |
1602
|
|
|
} |
1603
|
|
|
|
1604
|
|
|
if ( o.containment === "window" ) { |
1605
|
|
|
this.containment = [ |
1606
|
|
|
$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left, |
1607
|
|
|
$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top, |
1608
|
|
|
$( window ).scrollLeft() + $( window ).width() - |
1609
|
|
|
this.helperProportions.width - this.margins.left, |
1610
|
|
|
$( window ).scrollTop() + |
1611
|
|
|
( $( window ).height() || document.body.parentNode.scrollHeight ) - |
1612
|
|
|
this.helperProportions.height - this.margins.top |
1613
|
|
|
]; |
1614
|
|
|
return; |
1615
|
|
|
} |
1616
|
|
|
|
1617
|
|
|
if ( o.containment === "document" ) { |
1618
|
|
|
this.containment = [ |
1619
|
|
|
0, |
1620
|
|
|
0, |
1621
|
|
|
$( document ).width() - this.helperProportions.width - this.margins.left, |
1622
|
|
|
( $( document ).height() || document.body.parentNode.scrollHeight ) - |
1623
|
|
|
this.helperProportions.height - this.margins.top |
1624
|
|
|
]; |
1625
|
|
|
return; |
1626
|
|
|
} |
1627
|
|
|
|
1628
|
|
|
if ( o.containment.constructor === Array ) { |
1629
|
|
|
this.containment = o.containment; |
1630
|
|
|
return; |
1631
|
|
|
} |
1632
|
|
|
|
1633
|
|
|
if ( o.containment === "parent" ) { |
1634
|
|
|
o.containment = this.helper[ 0 ].parentNode; |
1635
|
|
|
} |
1636
|
|
|
|
1637
|
|
|
c = $( o.containment ); |
1638
|
|
|
ce = c[ 0 ]; |
1639
|
|
|
|
1640
|
|
|
if ( !ce ) { |
1641
|
|
|
return; |
1642
|
|
|
} |
1643
|
|
|
|
1644
|
|
|
isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) ); |
1645
|
|
|
|
1646
|
|
|
this.containment = [ |
1647
|
|
|
( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + |
1648
|
|
|
( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ), |
1649
|
|
|
( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + |
1650
|
|
|
( parseInt( c.css( "paddingTop" ), 10 ) || 0 ), |
1651
|
|
|
( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) - |
1652
|
|
|
( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) - |
1653
|
|
|
( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) - |
1654
|
|
|
this.helperProportions.width - |
1655
|
|
|
this.margins.left - |
1656
|
|
|
this.margins.right, |
1657
|
|
|
( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - |
1658
|
|
|
( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) - |
1659
|
|
|
( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) - |
1660
|
|
|
this.helperProportions.height - |
1661
|
|
|
this.margins.top - |
1662
|
|
|
this.margins.bottom |
1663
|
|
|
]; |
1664
|
|
|
this.relativeContainer = c; |
1665
|
|
|
}, |
1666
|
|
|
|
1667
|
|
|
_convertPositionTo: function( d, pos ) { |
1668
|
|
|
|
1669
|
|
|
if ( !pos ) { |
1670
|
|
|
pos = this.position; |
1671
|
|
|
} |
1672
|
|
|
|
1673
|
|
|
var mod = d === "absolute" ? 1 : -1, |
1674
|
|
|
scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ); |
1675
|
|
|
|
1676
|
|
|
return { |
1677
|
|
|
top: ( |
1678
|
|
|
|
1679
|
|
|
// The absolute mouse position |
1680
|
|
|
pos.top + |
1681
|
|
|
|
1682
|
|
|
// Only for relative positioned nodes: Relative offset from element to offset parent |
1683
|
|
|
this.offset.relative.top * mod + |
1684
|
|
|
|
1685
|
|
|
// The offsetParent's offset without borders (offset + border) |
1686
|
|
|
this.offset.parent.top * mod - |
1687
|
|
|
( ( this.cssPosition === "fixed" ? |
1688
|
|
|
-this.offset.scroll.top : |
1689
|
|
|
( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod ) |
1690
|
|
|
), |
1691
|
|
|
left: ( |
1692
|
|
|
|
1693
|
|
|
// The absolute mouse position |
1694
|
|
|
pos.left + |
1695
|
|
|
|
1696
|
|
|
// Only for relative positioned nodes: Relative offset from element to offset parent |
1697
|
|
|
this.offset.relative.left * mod + |
1698
|
|
|
|
1699
|
|
|
// The offsetParent's offset without borders (offset + border) |
1700
|
|
|
this.offset.parent.left * mod - |
1701
|
|
|
( ( this.cssPosition === "fixed" ? |
1702
|
|
|
-this.offset.scroll.left : |
1703
|
|
|
( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod ) |
1704
|
|
|
) |
1705
|
|
|
}; |
1706
|
|
|
|
1707
|
|
|
}, |
1708
|
|
|
|
1709
|
|
|
_generatePosition: function( event, constrainPosition ) { |
1710
|
|
|
|
1711
|
|
|
var containment, co, top, left, |
1712
|
|
|
o = this.options, |
1713
|
|
|
scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ), |
1714
|
|
|
pageX = event.pageX, |
1715
|
|
|
pageY = event.pageY; |
1716
|
|
|
|
1717
|
|
|
// Cache the scroll |
1718
|
|
|
if ( !scrollIsRootNode || !this.offset.scroll ) { |
1719
|
|
|
this.offset.scroll = { |
1720
|
|
|
top: this.scrollParent.scrollTop(), |
1721
|
|
|
left: this.scrollParent.scrollLeft() |
1722
|
|
|
}; |
1723
|
|
|
} |
1724
|
|
|
|
1725
|
|
|
/* |
1726
|
|
|
* - Position constraining - |
1727
|
|
|
* Constrain the position to a mix of grid, containment. |
1728
|
|
|
*/ |
1729
|
|
|
|
1730
|
|
|
// If we are not dragging yet, we won't check for options |
1731
|
|
|
if ( constrainPosition ) { |
1732
|
|
|
if ( this.containment ) { |
1733
|
|
|
if ( this.relativeContainer ) { |
1734
|
|
|
co = this.relativeContainer.offset(); |
1735
|
|
|
containment = [ |
1736
|
|
|
this.containment[ 0 ] + co.left, |
1737
|
|
|
this.containment[ 1 ] + co.top, |
1738
|
|
|
this.containment[ 2 ] + co.left, |
1739
|
|
|
this.containment[ 3 ] + co.top |
1740
|
|
|
]; |
1741
|
|
|
} else { |
1742
|
|
|
containment = this.containment; |
1743
|
|
|
} |
1744
|
|
|
|
1745
|
|
|
if ( event.pageX - this.offset.click.left < containment[ 0 ] ) { |
1746
|
|
|
pageX = containment[ 0 ] + this.offset.click.left; |
1747
|
|
|
} |
1748
|
|
|
if ( event.pageY - this.offset.click.top < containment[ 1 ] ) { |
1749
|
|
|
pageY = containment[ 1 ] + this.offset.click.top; |
1750
|
|
|
} |
1751
|
|
|
if ( event.pageX - this.offset.click.left > containment[ 2 ] ) { |
1752
|
|
|
pageX = containment[ 2 ] + this.offset.click.left; |
1753
|
|
|
} |
1754
|
|
|
if ( event.pageY - this.offset.click.top > containment[ 3 ] ) { |
1755
|
|
|
pageY = containment[ 3 ] + this.offset.click.top; |
1756
|
|
|
} |
1757
|
|
|
} |
1758
|
|
|
|
1759
|
|
View Code Duplication |
if ( o.grid ) { |
|
|
|
|
1760
|
|
|
|
1761
|
|
|
//Check for grid elements set to 0 to prevent divide by 0 error causing invalid |
1762
|
|
|
// argument errors in IE (see ticket #6950) |
1763
|
|
|
top = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY - |
1764
|
|
|
this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY; |
1765
|
|
|
pageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] || |
1766
|
|
|
top - this.offset.click.top > containment[ 3 ] ) ? |
1767
|
|
|
top : |
1768
|
|
|
( ( top - this.offset.click.top >= containment[ 1 ] ) ? |
1769
|
|
|
top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top; |
1770
|
|
|
|
1771
|
|
|
left = o.grid[ 0 ] ? this.originalPageX + |
1772
|
|
|
Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] : |
1773
|
|
|
this.originalPageX; |
1774
|
|
|
pageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] || |
1775
|
|
|
left - this.offset.click.left > containment[ 2 ] ) ? |
1776
|
|
|
left : |
1777
|
|
|
( ( left - this.offset.click.left >= containment[ 0 ] ) ? |
1778
|
|
|
left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left; |
1779
|
|
|
} |
1780
|
|
|
|
1781
|
|
|
if ( o.axis === "y" ) { |
1782
|
|
|
pageX = this.originalPageX; |
1783
|
|
|
} |
1784
|
|
|
|
1785
|
|
|
if ( o.axis === "x" ) { |
1786
|
|
|
pageY = this.originalPageY; |
1787
|
|
|
} |
1788
|
|
|
} |
1789
|
|
|
|
1790
|
|
|
return { |
1791
|
|
|
top: ( |
1792
|
|
|
|
1793
|
|
|
// The absolute mouse position |
1794
|
|
|
pageY - |
1795
|
|
|
|
1796
|
|
|
// Click offset (relative to the element) |
1797
|
|
|
this.offset.click.top - |
1798
|
|
|
|
1799
|
|
|
// Only for relative positioned nodes: Relative offset from element to offset parent |
1800
|
|
|
this.offset.relative.top - |
1801
|
|
|
|
1802
|
|
|
// The offsetParent's offset without borders (offset + border) |
1803
|
|
|
this.offset.parent.top + |
1804
|
|
|
( this.cssPosition === "fixed" ? |
1805
|
|
|
-this.offset.scroll.top : |
1806
|
|
|
( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) |
1807
|
|
|
), |
1808
|
|
|
left: ( |
1809
|
|
|
|
1810
|
|
|
// The absolute mouse position |
1811
|
|
|
pageX - |
1812
|
|
|
|
1813
|
|
|
// Click offset (relative to the element) |
1814
|
|
|
this.offset.click.left - |
1815
|
|
|
|
1816
|
|
|
// Only for relative positioned nodes: Relative offset from element to offset parent |
1817
|
|
|
this.offset.relative.left - |
1818
|
|
|
|
1819
|
|
|
// The offsetParent's offset without borders (offset + border) |
1820
|
|
|
this.offset.parent.left + |
1821
|
|
|
( this.cssPosition === "fixed" ? |
1822
|
|
|
-this.offset.scroll.left : |
1823
|
|
|
( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) |
1824
|
|
|
) |
1825
|
|
|
}; |
1826
|
|
|
|
1827
|
|
|
}, |
1828
|
|
|
|
1829
|
|
|
_clear: function() { |
1830
|
|
|
this._removeClass( this.helper, "ui-draggable-dragging" ); |
1831
|
|
|
if ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) { |
1832
|
|
|
this.helper.remove(); |
1833
|
|
|
} |
1834
|
|
|
this.helper = null; |
1835
|
|
|
this.cancelHelperRemoval = false; |
1836
|
|
|
if ( this.destroyOnClear ) { |
1837
|
|
|
this.destroy(); |
1838
|
|
|
} |
1839
|
|
|
}, |
1840
|
|
|
|
1841
|
|
|
// From now on bulk stuff - mainly helpers |
1842
|
|
|
|
1843
|
|
|
_trigger: function( type, event, ui ) { |
1844
|
|
|
ui = ui || this._uiHash(); |
1845
|
|
|
$.ui.plugin.call( this, type, [ event, ui, this ], true ); |
1846
|
|
|
|
1847
|
|
|
// Absolute position and offset (see #6884 ) have to be recalculated after plugins |
1848
|
|
|
if ( /^(drag|start|stop)/.test( type ) ) { |
1849
|
|
|
this.positionAbs = this._convertPositionTo( "absolute" ); |
1850
|
|
|
ui.offset = this.positionAbs; |
1851
|
|
|
} |
1852
|
|
|
return $.Widget.prototype._trigger.call( this, type, event, ui ); |
1853
|
|
|
}, |
1854
|
|
|
|
1855
|
|
|
plugins: {}, |
1856
|
|
|
|
1857
|
|
|
_uiHash: function() { |
1858
|
|
|
return { |
1859
|
|
|
helper: this.helper, |
1860
|
|
|
position: this.position, |
1861
|
|
|
originalPosition: this.originalPosition, |
1862
|
|
|
offset: this.positionAbs |
1863
|
|
|
}; |
1864
|
|
|
} |
1865
|
|
|
|
1866
|
|
|
} ); |
1867
|
|
|
|
1868
|
|
|
$.ui.plugin.add( "draggable", "connectToSortable", { |
1869
|
|
|
start: function( event, ui, draggable ) { |
1870
|
|
|
var uiSortable = $.extend( {}, ui, { |
1871
|
|
|
item: draggable.element |
1872
|
|
|
} ); |
1873
|
|
|
|
1874
|
|
|
draggable.sortables = []; |
1875
|
|
|
$( draggable.options.connectToSortable ).each( function() { |
1876
|
|
|
var sortable = $( this ).sortable( "instance" ); |
1877
|
|
|
|
1878
|
|
|
if ( sortable && !sortable.options.disabled ) { |
1879
|
|
|
draggable.sortables.push( sortable ); |
1880
|
|
|
|
1881
|
|
|
// RefreshPositions is called at drag start to refresh the containerCache |
1882
|
|
|
// which is used in drag. This ensures it's initialized and synchronized |
1883
|
|
|
// with any changes that might have happened on the page since initialization. |
1884
|
|
|
sortable.refreshPositions(); |
1885
|
|
|
sortable._trigger( "activate", event, uiSortable ); |
1886
|
|
|
} |
1887
|
|
|
} ); |
1888
|
|
|
}, |
1889
|
|
|
stop: function( event, ui, draggable ) { |
1890
|
|
|
var uiSortable = $.extend( {}, ui, { |
1891
|
|
|
item: draggable.element |
1892
|
|
|
} ); |
1893
|
|
|
|
1894
|
|
|
draggable.cancelHelperRemoval = false; |
1895
|
|
|
|
1896
|
|
|
$.each( draggable.sortables, function() { |
1897
|
|
|
var sortable = this; |
1898
|
|
|
|
1899
|
|
|
if ( sortable.isOver ) { |
1900
|
|
|
sortable.isOver = 0; |
1901
|
|
|
|
1902
|
|
|
// Allow this sortable to handle removing the helper |
1903
|
|
|
draggable.cancelHelperRemoval = true; |
1904
|
|
|
sortable.cancelHelperRemoval = false; |
1905
|
|
|
|
1906
|
|
|
// Use _storedCSS To restore properties in the sortable, |
1907
|
|
|
// as this also handles revert (#9675) since the draggable |
1908
|
|
|
// may have modified them in unexpected ways (#8809) |
1909
|
|
|
sortable._storedCSS = { |
1910
|
|
|
position: sortable.placeholder.css( "position" ), |
1911
|
|
|
top: sortable.placeholder.css( "top" ), |
1912
|
|
|
left: sortable.placeholder.css( "left" ) |
1913
|
|
|
}; |
1914
|
|
|
|
1915
|
|
|
sortable._mouseStop( event ); |
1916
|
|
|
|
1917
|
|
|
// Once drag has ended, the sortable should return to using |
1918
|
|
|
// its original helper, not the shared helper from draggable |
1919
|
|
|
sortable.options.helper = sortable.options._helper; |
1920
|
|
|
} else { |
1921
|
|
|
|
1922
|
|
|
// Prevent this Sortable from removing the helper. |
1923
|
|
|
// However, don't set the draggable to remove the helper |
1924
|
|
|
// either as another connected Sortable may yet handle the removal. |
1925
|
|
|
sortable.cancelHelperRemoval = true; |
1926
|
|
|
|
1927
|
|
|
sortable._trigger( "deactivate", event, uiSortable ); |
1928
|
|
|
} |
1929
|
|
|
} ); |
1930
|
|
|
}, |
1931
|
|
|
drag: function( event, ui, draggable ) { |
1932
|
|
|
$.each( draggable.sortables, function() { |
1933
|
|
|
var innermostIntersecting = false, |
1934
|
|
|
sortable = this; |
1935
|
|
|
|
1936
|
|
|
// Copy over variables that sortable's _intersectsWith uses |
1937
|
|
|
sortable.positionAbs = draggable.positionAbs; |
1938
|
|
|
sortable.helperProportions = draggable.helperProportions; |
1939
|
|
|
sortable.offset.click = draggable.offset.click; |
1940
|
|
|
|
1941
|
|
|
if ( sortable._intersectsWith( sortable.containerCache ) ) { |
1942
|
|
|
innermostIntersecting = true; |
1943
|
|
|
|
1944
|
|
|
$.each( draggable.sortables, function() { |
1945
|
|
|
|
1946
|
|
|
// Copy over variables that sortable's _intersectsWith uses |
1947
|
|
|
this.positionAbs = draggable.positionAbs; |
1948
|
|
|
this.helperProportions = draggable.helperProportions; |
1949
|
|
|
this.offset.click = draggable.offset.click; |
1950
|
|
|
|
1951
|
|
|
if ( this !== sortable && |
1952
|
|
|
this._intersectsWith( this.containerCache ) && |
1953
|
|
|
$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) { |
1954
|
|
|
innermostIntersecting = false; |
1955
|
|
|
} |
1956
|
|
|
|
1957
|
|
|
return innermostIntersecting; |
1958
|
|
|
} ); |
1959
|
|
|
} |
1960
|
|
|
|
1961
|
|
|
if ( innermostIntersecting ) { |
1962
|
|
|
|
1963
|
|
|
// If it intersects, we use a little isOver variable and set it once, |
1964
|
|
|
// so that the move-in stuff gets fired only once. |
1965
|
|
|
if ( !sortable.isOver ) { |
1966
|
|
|
sortable.isOver = 1; |
1967
|
|
|
|
1968
|
|
|
// Store draggable's parent in case we need to reappend to it later. |
1969
|
|
|
draggable._parent = ui.helper.parent(); |
1970
|
|
|
|
1971
|
|
|
sortable.currentItem = ui.helper |
1972
|
|
|
.appendTo( sortable.element ) |
1973
|
|
|
.data( "ui-sortable-item", true ); |
1974
|
|
|
|
1975
|
|
|
// Store helper option to later restore it |
1976
|
|
|
sortable.options._helper = sortable.options.helper; |
1977
|
|
|
|
1978
|
|
|
sortable.options.helper = function() { |
1979
|
|
|
return ui.helper[ 0 ]; |
1980
|
|
|
}; |
1981
|
|
|
|
1982
|
|
|
// Fire the start events of the sortable with our passed browser event, |
1983
|
|
|
// and our own helper (so it doesn't create a new one) |
1984
|
|
|
event.target = sortable.currentItem[ 0 ]; |
1985
|
|
|
sortable._mouseCapture( event, true ); |
1986
|
|
|
sortable._mouseStart( event, true, true ); |
1987
|
|
|
|
1988
|
|
|
// Because the browser event is way off the new appended portlet, |
1989
|
|
|
// modify necessary variables to reflect the changes |
1990
|
|
|
sortable.offset.click.top = draggable.offset.click.top; |
1991
|
|
|
sortable.offset.click.left = draggable.offset.click.left; |
1992
|
|
|
sortable.offset.parent.left -= draggable.offset.parent.left - |
1993
|
|
|
sortable.offset.parent.left; |
1994
|
|
|
sortable.offset.parent.top -= draggable.offset.parent.top - |
1995
|
|
|
sortable.offset.parent.top; |
1996
|
|
|
|
1997
|
|
|
draggable._trigger( "toSortable", event ); |
1998
|
|
|
|
1999
|
|
|
// Inform draggable that the helper is in a valid drop zone, |
2000
|
|
|
// used solely in the revert option to handle "valid/invalid". |
2001
|
|
|
draggable.dropped = sortable.element; |
2002
|
|
|
|
2003
|
|
|
// Need to refreshPositions of all sortables in the case that |
2004
|
|
|
// adding to one sortable changes the location of the other sortables (#9675) |
2005
|
|
|
$.each( draggable.sortables, function() { |
2006
|
|
|
this.refreshPositions(); |
2007
|
|
|
} ); |
2008
|
|
|
|
2009
|
|
|
// Hack so receive/update callbacks work (mostly) |
2010
|
|
|
draggable.currentItem = draggable.element; |
2011
|
|
|
sortable.fromOutside = draggable; |
2012
|
|
|
} |
2013
|
|
|
|
2014
|
|
|
if ( sortable.currentItem ) { |
2015
|
|
|
sortable._mouseDrag( event ); |
2016
|
|
|
|
2017
|
|
|
// Copy the sortable's position because the draggable's can potentially reflect |
2018
|
|
|
// a relative position, while sortable is always absolute, which the dragged |
2019
|
|
|
// element has now become. (#8809) |
2020
|
|
|
ui.position = sortable.position; |
2021
|
|
|
} |
2022
|
|
|
} else { |
2023
|
|
|
|
2024
|
|
|
// If it doesn't intersect with the sortable, and it intersected before, |
2025
|
|
|
// we fake the drag stop of the sortable, but make sure it doesn't remove |
2026
|
|
|
// the helper by using cancelHelperRemoval. |
2027
|
|
|
if ( sortable.isOver ) { |
2028
|
|
|
|
2029
|
|
|
sortable.isOver = 0; |
2030
|
|
|
sortable.cancelHelperRemoval = true; |
2031
|
|
|
|
2032
|
|
|
// Calling sortable's mouseStop would trigger a revert, |
2033
|
|
|
// so revert must be temporarily false until after mouseStop is called. |
2034
|
|
|
sortable.options._revert = sortable.options.revert; |
2035
|
|
|
sortable.options.revert = false; |
2036
|
|
|
|
2037
|
|
|
sortable._trigger( "out", event, sortable._uiHash( sortable ) ); |
2038
|
|
|
sortable._mouseStop( event, true ); |
2039
|
|
|
|
2040
|
|
|
// Restore sortable behaviors that were modfied |
2041
|
|
|
// when the draggable entered the sortable area (#9481) |
2042
|
|
|
sortable.options.revert = sortable.options._revert; |
2043
|
|
|
sortable.options.helper = sortable.options._helper; |
2044
|
|
|
|
2045
|
|
|
if ( sortable.placeholder ) { |
2046
|
|
|
sortable.placeholder.remove(); |
2047
|
|
|
} |
2048
|
|
|
|
2049
|
|
|
// Restore and recalculate the draggable's offset considering the sortable |
2050
|
|
|
// may have modified them in unexpected ways. (#8809, #10669) |
2051
|
|
|
ui.helper.appendTo( draggable._parent ); |
2052
|
|
|
draggable._refreshOffsets( event ); |
2053
|
|
|
ui.position = draggable._generatePosition( event, true ); |
2054
|
|
|
|
2055
|
|
|
draggable._trigger( "fromSortable", event ); |
2056
|
|
|
|
2057
|
|
|
// Inform draggable that the helper is no longer in a valid drop zone |
2058
|
|
|
draggable.dropped = false; |
2059
|
|
|
|
2060
|
|
|
// Need to refreshPositions of all sortables just in case removing |
2061
|
|
|
// from one sortable changes the location of other sortables (#9675) |
2062
|
|
|
$.each( draggable.sortables, function() { |
2063
|
|
|
this.refreshPositions(); |
2064
|
|
|
} ); |
2065
|
|
|
} |
2066
|
|
|
} |
2067
|
|
|
} ); |
2068
|
|
|
} |
2069
|
|
|
} ); |
2070
|
|
|
|
2071
|
|
|
$.ui.plugin.add( "draggable", "cursor", { |
2072
|
|
|
start: function( event, ui, instance ) { |
2073
|
|
|
var t = $( "body" ), |
2074
|
|
|
o = instance.options; |
2075
|
|
|
|
2076
|
|
|
if ( t.css( "cursor" ) ) { |
2077
|
|
|
o._cursor = t.css( "cursor" ); |
2078
|
|
|
} |
2079
|
|
|
t.css( "cursor", o.cursor ); |
2080
|
|
|
}, |
2081
|
|
|
stop: function( event, ui, instance ) { |
2082
|
|
|
var o = instance.options; |
2083
|
|
|
if ( o._cursor ) { |
2084
|
|
|
$( "body" ).css( "cursor", o._cursor ); |
2085
|
|
|
} |
2086
|
|
|
} |
2087
|
|
|
} ); |
2088
|
|
|
|
2089
|
|
|
$.ui.plugin.add( "draggable", "opacity", { |
2090
|
|
|
start: function( event, ui, instance ) { |
2091
|
|
|
var t = $( ui.helper ), |
2092
|
|
|
o = instance.options; |
2093
|
|
|
if ( t.css( "opacity" ) ) { |
2094
|
|
|
o._opacity = t.css( "opacity" ); |
2095
|
|
|
} |
2096
|
|
|
t.css( "opacity", o.opacity ); |
2097
|
|
|
}, |
2098
|
|
|
stop: function( event, ui, instance ) { |
2099
|
|
|
var o = instance.options; |
2100
|
|
|
if ( o._opacity ) { |
2101
|
|
|
$( ui.helper ).css( "opacity", o._opacity ); |
2102
|
|
|
} |
2103
|
|
|
} |
2104
|
|
|
} ); |
2105
|
|
|
|
2106
|
|
|
$.ui.plugin.add( "draggable", "scroll", { |
2107
|
|
|
start: function( event, ui, i ) { |
2108
|
|
|
if ( !i.scrollParentNotHidden ) { |
2109
|
|
|
i.scrollParentNotHidden = i.helper.scrollParent( false ); |
2110
|
|
|
} |
2111
|
|
|
|
2112
|
|
|
if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && |
2113
|
|
|
i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) { |
2114
|
|
|
i.overflowOffset = i.scrollParentNotHidden.offset(); |
2115
|
|
|
} |
2116
|
|
|
}, |
2117
|
|
|
drag: function( event, ui, i ) { |
2118
|
|
|
|
2119
|
|
|
var o = i.options, |
2120
|
|
|
scrolled = false, |
2121
|
|
|
scrollParent = i.scrollParentNotHidden[ 0 ], |
2122
|
|
|
document = i.document[ 0 ]; |
2123
|
|
|
|
2124
|
|
|
if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) { |
2125
|
|
|
if ( !o.axis || o.axis !== "x" ) { |
2126
|
|
|
if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < |
2127
|
|
|
o.scrollSensitivity ) { |
2128
|
|
|
scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed; |
2129
|
|
|
} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) { |
2130
|
|
|
scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed; |
2131
|
|
|
} |
2132
|
|
|
} |
2133
|
|
|
|
2134
|
|
|
if ( !o.axis || o.axis !== "y" ) { |
2135
|
|
|
if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < |
2136
|
|
|
o.scrollSensitivity ) { |
2137
|
|
|
scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed; |
2138
|
|
|
} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) { |
2139
|
|
|
scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed; |
2140
|
|
|
} |
2141
|
|
|
} |
2142
|
|
|
|
2143
|
|
|
} else { |
2144
|
|
|
|
2145
|
|
|
if ( !o.axis || o.axis !== "x" ) { |
2146
|
|
|
if ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) { |
2147
|
|
|
scrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed ); |
2148
|
|
|
} else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) < |
2149
|
|
|
o.scrollSensitivity ) { |
2150
|
|
|
scrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed ); |
2151
|
|
|
} |
2152
|
|
|
} |
2153
|
|
|
|
2154
|
|
|
if ( !o.axis || o.axis !== "y" ) { |
2155
|
|
|
if ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) { |
2156
|
|
|
scrolled = $( document ).scrollLeft( |
2157
|
|
|
$( document ).scrollLeft() - o.scrollSpeed |
2158
|
|
|
); |
2159
|
|
|
} else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) < |
2160
|
|
|
o.scrollSensitivity ) { |
2161
|
|
|
scrolled = $( document ).scrollLeft( |
2162
|
|
|
$( document ).scrollLeft() + o.scrollSpeed |
2163
|
|
|
); |
2164
|
|
|
} |
2165
|
|
|
} |
2166
|
|
|
|
2167
|
|
|
} |
2168
|
|
|
|
2169
|
|
|
if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) { |
2170
|
|
|
$.ui.ddmanager.prepareOffsets( i, event ); |
2171
|
|
|
} |
2172
|
|
|
|
2173
|
|
|
} |
2174
|
|
|
} ); |
2175
|
|
|
|
2176
|
|
|
$.ui.plugin.add( "draggable", "snap", { |
2177
|
|
|
start: function( event, ui, i ) { |
2178
|
|
|
|
2179
|
|
|
var o = i.options; |
2180
|
|
|
|
2181
|
|
|
i.snapElements = []; |
2182
|
|
|
|
2183
|
|
|
$( o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap ) |
2184
|
|
|
.each( function() { |
2185
|
|
|
var $t = $( this ), |
2186
|
|
|
$o = $t.offset(); |
2187
|
|
|
if ( this !== i.element[ 0 ] ) { |
2188
|
|
|
i.snapElements.push( { |
2189
|
|
|
item: this, |
2190
|
|
|
width: $t.outerWidth(), height: $t.outerHeight(), |
2191
|
|
|
top: $o.top, left: $o.left |
2192
|
|
|
} ); |
2193
|
|
|
} |
2194
|
|
|
} ); |
2195
|
|
|
|
2196
|
|
|
}, |
2197
|
|
|
drag: function( event, ui, inst ) { |
2198
|
|
|
|
2199
|
|
|
var ts, bs, ls, rs, l, r, t, b, i, first, |
2200
|
|
|
o = inst.options, |
2201
|
|
|
d = o.snapTolerance, |
2202
|
|
|
x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width, |
2203
|
|
|
y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height; |
2204
|
|
|
|
2205
|
|
|
for ( i = inst.snapElements.length - 1; i >= 0; i-- ) { |
2206
|
|
|
|
2207
|
|
|
l = inst.snapElements[ i ].left - inst.margins.left; |
2208
|
|
|
r = l + inst.snapElements[ i ].width; |
2209
|
|
|
t = inst.snapElements[ i ].top - inst.margins.top; |
2210
|
|
|
b = t + inst.snapElements[ i ].height; |
2211
|
|
|
|
2212
|
|
|
if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || |
2213
|
|
|
!$.contains( inst.snapElements[ i ].item.ownerDocument, |
2214
|
|
|
inst.snapElements[ i ].item ) ) { |
2215
|
|
|
if ( inst.snapElements[ i ].snapping ) { |
2216
|
|
|
( inst.options.snap.release && |
2217
|
|
|
inst.options.snap.release.call( |
2218
|
|
|
inst.element, |
2219
|
|
|
event, |
2220
|
|
|
$.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } ) |
2221
|
|
|
) ); |
2222
|
|
|
} |
2223
|
|
|
inst.snapElements[ i ].snapping = false; |
2224
|
|
|
continue; |
2225
|
|
|
} |
2226
|
|
|
|
2227
|
|
View Code Duplication |
if ( o.snapMode !== "inner" ) { |
|
|
|
|
2228
|
|
|
ts = Math.abs( t - y2 ) <= d; |
2229
|
|
|
bs = Math.abs( b - y1 ) <= d; |
2230
|
|
|
ls = Math.abs( l - x2 ) <= d; |
2231
|
|
|
rs = Math.abs( r - x1 ) <= d; |
2232
|
|
|
if ( ts ) { |
2233
|
|
|
ui.position.top = inst._convertPositionTo( "relative", { |
2234
|
|
|
top: t - inst.helperProportions.height, |
2235
|
|
|
left: 0 |
2236
|
|
|
} ).top; |
2237
|
|
|
} |
2238
|
|
|
if ( bs ) { |
2239
|
|
|
ui.position.top = inst._convertPositionTo( "relative", { |
2240
|
|
|
top: b, |
2241
|
|
|
left: 0 |
2242
|
|
|
} ).top; |
2243
|
|
|
} |
2244
|
|
|
if ( ls ) { |
2245
|
|
|
ui.position.left = inst._convertPositionTo( "relative", { |
2246
|
|
|
top: 0, |
2247
|
|
|
left: l - inst.helperProportions.width |
2248
|
|
|
} ).left; |
2249
|
|
|
} |
2250
|
|
|
if ( rs ) { |
2251
|
|
|
ui.position.left = inst._convertPositionTo( "relative", { |
2252
|
|
|
top: 0, |
2253
|
|
|
left: r |
2254
|
|
|
} ).left; |
2255
|
|
|
} |
2256
|
|
|
} |
2257
|
|
|
|
2258
|
|
|
first = ( ts || bs || ls || rs ); |
2259
|
|
|
|
2260
|
|
View Code Duplication |
if ( o.snapMode !== "outer" ) { |
|
|
|
|
2261
|
|
|
ts = Math.abs( t - y1 ) <= d; |
2262
|
|
|
bs = Math.abs( b - y2 ) <= d; |
2263
|
|
|
ls = Math.abs( l - x1 ) <= d; |
2264
|
|
|
rs = Math.abs( r - x2 ) <= d; |
2265
|
|
|
if ( ts ) { |
2266
|
|
|
ui.position.top = inst._convertPositionTo( "relative", { |
2267
|
|
|
top: t, |
2268
|
|
|
left: 0 |
2269
|
|
|
} ).top; |
2270
|
|
|
} |
2271
|
|
|
if ( bs ) { |
2272
|
|
|
ui.position.top = inst._convertPositionTo( "relative", { |
2273
|
|
|
top: b - inst.helperProportions.height, |
2274
|
|
|
left: 0 |
2275
|
|
|
} ).top; |
2276
|
|
|
} |
2277
|
|
|
if ( ls ) { |
2278
|
|
|
ui.position.left = inst._convertPositionTo( "relative", { |
2279
|
|
|
top: 0, |
2280
|
|
|
left: l |
2281
|
|
|
} ).left; |
2282
|
|
|
} |
2283
|
|
|
if ( rs ) { |
2284
|
|
|
ui.position.left = inst._convertPositionTo( "relative", { |
2285
|
|
|
top: 0, |
2286
|
|
|
left: r - inst.helperProportions.width |
2287
|
|
|
} ).left; |
2288
|
|
|
} |
2289
|
|
|
} |
2290
|
|
|
|
2291
|
|
|
if ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) { |
2292
|
|
|
( inst.options.snap.snap && |
2293
|
|
|
inst.options.snap.snap.call( |
2294
|
|
|
inst.element, |
2295
|
|
|
event, |
2296
|
|
|
$.extend( inst._uiHash(), { |
2297
|
|
|
snapItem: inst.snapElements[ i ].item |
2298
|
|
|
} ) ) ); |
2299
|
|
|
} |
2300
|
|
|
inst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first ); |
2301
|
|
|
|
2302
|
|
|
} |
2303
|
|
|
|
2304
|
|
|
} |
2305
|
|
|
} ); |
2306
|
|
|
|
2307
|
|
|
$.ui.plugin.add( "draggable", "stack", { |
2308
|
|
|
start: function( event, ui, instance ) { |
2309
|
|
|
var min, |
2310
|
|
|
o = instance.options, |
2311
|
|
|
group = $.makeArray( $( o.stack ) ).sort( function( a, b ) { |
2312
|
|
|
return ( parseInt( $( a ).css( "zIndex" ), 10 ) || 0 ) - |
2313
|
|
|
( parseInt( $( b ).css( "zIndex" ), 10 ) || 0 ); |
2314
|
|
|
} ); |
2315
|
|
|
|
2316
|
|
|
if ( !group.length ) { return; } |
2317
|
|
|
|
2318
|
|
|
min = parseInt( $( group[ 0 ] ).css( "zIndex" ), 10 ) || 0; |
2319
|
|
|
$( group ).each( function( i ) { |
2320
|
|
|
$( this ).css( "zIndex", min + i ); |
2321
|
|
|
} ); |
2322
|
|
|
this.css( "zIndex", ( min + group.length ) ); |
2323
|
|
|
} |
2324
|
|
|
} ); |
2325
|
|
|
|
2326
|
|
|
$.ui.plugin.add( "draggable", "zIndex", { |
2327
|
|
|
start: function( event, ui, instance ) { |
2328
|
|
|
var t = $( ui.helper ), |
2329
|
|
|
o = instance.options; |
2330
|
|
|
|
2331
|
|
|
if ( t.css( "zIndex" ) ) { |
2332
|
|
|
o._zIndex = t.css( "zIndex" ); |
2333
|
|
|
} |
2334
|
|
|
t.css( "zIndex", o.zIndex ); |
2335
|
|
|
}, |
2336
|
|
|
stop: function( event, ui, instance ) { |
2337
|
|
|
var o = instance.options; |
2338
|
|
|
|
2339
|
|
|
if ( o._zIndex ) { |
2340
|
|
|
$( ui.helper ).css( "zIndex", o._zIndex ); |
2341
|
|
|
} |
2342
|
|
|
} |
2343
|
|
|
} ); |
2344
|
|
|
|
2345
|
|
|
var widgetsDraggable = $.ui.draggable; |
|
|
|
|
2346
|
|
|
|
2347
|
|
|
|
2348
|
|
|
/*! |
2349
|
|
|
* jQuery UI Droppable 1.12.0 |
2350
|
|
|
* http://jqueryui.com |
2351
|
|
|
* |
2352
|
|
|
* Copyright jQuery Foundation and other contributors |
2353
|
|
|
* Released under the MIT license. |
2354
|
|
|
* http://jquery.org/license |
2355
|
|
|
*/ |
2356
|
|
|
|
2357
|
|
|
//>>label: Droppable |
2358
|
|
|
//>>group: Interactions |
2359
|
|
|
//>>description: Enables drop targets for draggable elements. |
2360
|
|
|
//>>docs: http://api.jqueryui.com/droppable/ |
2361
|
|
|
//>>demos: http://jqueryui.com/droppable/ |
2362
|
|
|
|
2363
|
|
|
|
2364
|
|
|
|
2365
|
|
|
$.widget( "ui.droppable", { |
2366
|
|
|
version: "1.12.0", |
2367
|
|
|
widgetEventPrefix: "drop", |
2368
|
|
|
options: { |
2369
|
|
|
accept: "*", |
2370
|
|
|
addClasses: true, |
2371
|
|
|
greedy: false, |
2372
|
|
|
scope: "default", |
2373
|
|
|
tolerance: "intersect", |
2374
|
|
|
|
2375
|
|
|
// Callbacks |
2376
|
|
|
activate: null, |
2377
|
|
|
deactivate: null, |
2378
|
|
|
drop: null, |
2379
|
|
|
out: null, |
2380
|
|
|
over: null |
2381
|
|
|
}, |
2382
|
|
|
_create: function() { |
2383
|
|
|
|
2384
|
|
|
var proportions, |
2385
|
|
|
o = this.options, |
2386
|
|
|
accept = o.accept; |
2387
|
|
|
|
2388
|
|
|
this.isover = false; |
2389
|
|
|
this.isout = true; |
2390
|
|
|
|
2391
|
|
|
this.accept = $.isFunction( accept ) ? accept : function( d ) { |
2392
|
|
|
return d.is( accept ); |
2393
|
|
|
}; |
2394
|
|
|
|
2395
|
|
|
this.proportions = function( /* valueToWrite */ ) { |
2396
|
|
|
if ( arguments.length ) { |
2397
|
|
|
|
2398
|
|
|
// Store the droppable's proportions |
2399
|
|
|
proportions = arguments[ 0 ]; |
|
|
|
|
2400
|
|
|
} else { |
2401
|
|
|
|
2402
|
|
|
// Retrieve or derive the droppable's proportions |
2403
|
|
|
return proportions ? |
2404
|
|
|
proportions : |
2405
|
|
|
proportions = { |
2406
|
|
|
width: this.element[ 0 ].offsetWidth, |
2407
|
|
|
height: this.element[ 0 ].offsetHeight |
2408
|
|
|
}; |
2409
|
|
|
} |
2410
|
|
|
}; |
2411
|
|
|
|
2412
|
|
|
this._addToManager( o.scope ); |
2413
|
|
|
|
2414
|
|
|
o.addClasses && this._addClass( "ui-droppable" ); |
2415
|
|
|
|
2416
|
|
|
}, |
2417
|
|
|
|
2418
|
|
|
_addToManager: function( scope ) { |
2419
|
|
|
|
2420
|
|
|
// Add the reference and positions to the manager |
2421
|
|
|
$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || []; |
2422
|
|
|
$.ui.ddmanager.droppables[ scope ].push( this ); |
2423
|
|
|
}, |
2424
|
|
|
|
2425
|
|
|
_splice: function( drop ) { |
2426
|
|
|
var i = 0; |
2427
|
|
|
for ( ; i < drop.length; i++ ) { |
2428
|
|
|
if ( drop[ i ] === this ) { |
2429
|
|
|
drop.splice( i, 1 ); |
2430
|
|
|
} |
2431
|
|
|
} |
2432
|
|
|
}, |
2433
|
|
|
|
2434
|
|
|
_destroy: function() { |
2435
|
|
|
var drop = $.ui.ddmanager.droppables[ this.options.scope ]; |
2436
|
|
|
|
2437
|
|
|
this._splice( drop ); |
2438
|
|
|
}, |
2439
|
|
|
|
2440
|
|
|
_setOption: function( key, value ) { |
2441
|
|
|
|
2442
|
|
|
if ( key === "accept" ) { |
2443
|
|
|
this.accept = $.isFunction( value ) ? value : function( d ) { |
2444
|
|
|
return d.is( value ); |
2445
|
|
|
}; |
2446
|
|
|
} else if ( key === "scope" ) { |
2447
|
|
|
var drop = $.ui.ddmanager.droppables[ this.options.scope ]; |
2448
|
|
|
|
2449
|
|
|
this._splice( drop ); |
2450
|
|
|
this._addToManager( value ); |
2451
|
|
|
} |
2452
|
|
|
|
2453
|
|
|
this._super( key, value ); |
2454
|
|
|
}, |
2455
|
|
|
|
2456
|
|
|
_activate: function( event ) { |
2457
|
|
|
var draggable = $.ui.ddmanager.current; |
2458
|
|
|
|
2459
|
|
|
this._addActiveClass(); |
2460
|
|
|
if ( draggable ) { |
2461
|
|
|
this._trigger( "activate", event, this.ui( draggable ) ); |
2462
|
|
|
} |
2463
|
|
|
}, |
2464
|
|
|
|
2465
|
|
|
_deactivate: function( event ) { |
2466
|
|
|
var draggable = $.ui.ddmanager.current; |
2467
|
|
|
|
2468
|
|
|
this._removeActiveClass(); |
2469
|
|
|
if ( draggable ) { |
2470
|
|
|
this._trigger( "deactivate", event, this.ui( draggable ) ); |
2471
|
|
|
} |
2472
|
|
|
}, |
2473
|
|
|
|
2474
|
|
|
_over: function( event ) { |
2475
|
|
|
|
2476
|
|
|
var draggable = $.ui.ddmanager.current; |
2477
|
|
|
|
2478
|
|
|
// Bail if draggable and droppable are same element |
2479
|
|
|
if ( !draggable || ( draggable.currentItem || |
2480
|
|
|
draggable.element )[ 0 ] === this.element[ 0 ] ) { |
2481
|
|
|
return; |
2482
|
|
|
} |
2483
|
|
|
|
2484
|
|
|
if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || |
2485
|
|
|
draggable.element ) ) ) { |
2486
|
|
|
this._addHoverClass(); |
2487
|
|
|
this._trigger( "over", event, this.ui( draggable ) ); |
2488
|
|
|
} |
2489
|
|
|
|
2490
|
|
|
}, |
2491
|
|
|
|
2492
|
|
|
_out: function( event ) { |
2493
|
|
|
|
2494
|
|
|
var draggable = $.ui.ddmanager.current; |
2495
|
|
|
|
2496
|
|
|
// Bail if draggable and droppable are same element |
2497
|
|
|
if ( !draggable || ( draggable.currentItem || |
2498
|
|
|
draggable.element )[ 0 ] === this.element[ 0 ] ) { |
2499
|
|
|
return; |
2500
|
|
|
} |
2501
|
|
|
|
2502
|
|
|
if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || |
2503
|
|
|
draggable.element ) ) ) { |
2504
|
|
|
this._removeHoverClass(); |
2505
|
|
|
this._trigger( "out", event, this.ui( draggable ) ); |
2506
|
|
|
} |
2507
|
|
|
|
2508
|
|
|
}, |
2509
|
|
|
|
2510
|
|
|
_drop: function( event, custom ) { |
2511
|
|
|
|
2512
|
|
|
var draggable = custom || $.ui.ddmanager.current, |
2513
|
|
|
childrenIntersection = false; |
2514
|
|
|
|
2515
|
|
|
// Bail if draggable and droppable are same element |
2516
|
|
|
if ( !draggable || ( draggable.currentItem || |
2517
|
|
|
draggable.element )[ 0 ] === this.element[ 0 ] ) { |
2518
|
|
|
return false; |
2519
|
|
|
} |
2520
|
|
|
|
2521
|
|
|
this.element |
2522
|
|
|
.find( ":data(ui-droppable)" ) |
2523
|
|
|
.not( ".ui-draggable-dragging" ) |
2524
|
|
|
.each( function() { |
2525
|
|
|
var inst = $( this ).droppable( "instance" ); |
2526
|
|
|
if ( |
|
|
|
|
2527
|
|
|
inst.options.greedy && |
2528
|
|
|
!inst.options.disabled && |
2529
|
|
|
inst.options.scope === draggable.options.scope && |
2530
|
|
|
inst.accept.call( |
2531
|
|
|
inst.element[ 0 ], ( draggable.currentItem || draggable.element ) |
2532
|
|
|
) && |
2533
|
|
|
intersect( |
2534
|
|
|
draggable, |
2535
|
|
|
$.extend( inst, { offset: inst.element.offset() } ), |
2536
|
|
|
inst.options.tolerance, event |
2537
|
|
|
) |
2538
|
|
|
) { |
2539
|
|
|
childrenIntersection = true; |
2540
|
|
|
return false; } |
2541
|
|
|
} ); |
2542
|
|
|
if ( childrenIntersection ) { |
2543
|
|
|
return false; |
2544
|
|
|
} |
2545
|
|
|
|
2546
|
|
|
if ( this.accept.call( this.element[ 0 ], |
2547
|
|
|
( draggable.currentItem || draggable.element ) ) ) { |
2548
|
|
|
this._removeActiveClass(); |
2549
|
|
|
this._removeHoverClass(); |
2550
|
|
|
|
2551
|
|
|
this._trigger( "drop", event, this.ui( draggable ) ); |
2552
|
|
|
return this.element; |
2553
|
|
|
} |
2554
|
|
|
|
2555
|
|
|
return false; |
2556
|
|
|
|
2557
|
|
|
}, |
2558
|
|
|
|
2559
|
|
|
ui: function( c ) { |
2560
|
|
|
return { |
2561
|
|
|
draggable: ( c.currentItem || c.element ), |
2562
|
|
|
helper: c.helper, |
2563
|
|
|
position: c.position, |
2564
|
|
|
offset: c.positionAbs |
2565
|
|
|
}; |
2566
|
|
|
}, |
2567
|
|
|
|
2568
|
|
|
// Extension points just to make backcompat sane and avoid duplicating logic |
2569
|
|
|
// TODO: Remove in 1.13 along with call to it below |
2570
|
|
|
_addHoverClass: function() { |
2571
|
|
|
this._addClass( "ui-droppable-hover" ); |
2572
|
|
|
}, |
2573
|
|
|
|
2574
|
|
|
_removeHoverClass: function() { |
2575
|
|
|
this._removeClass( "ui-droppable-hover" ); |
2576
|
|
|
}, |
2577
|
|
|
|
2578
|
|
|
_addActiveClass: function() { |
2579
|
|
|
this._addClass( "ui-droppable-active" ); |
2580
|
|
|
}, |
2581
|
|
|
|
2582
|
|
|
_removeActiveClass: function() { |
2583
|
|
|
this._removeClass( "ui-droppable-active" ); |
2584
|
|
|
} |
2585
|
|
|
} ); |
2586
|
|
|
|
2587
|
|
|
var intersect = $.ui.intersect = ( function() { |
2588
|
|
|
function isOverAxis( x, reference, size ) { |
2589
|
|
|
return ( x >= reference ) && ( x < ( reference + size ) ); |
2590
|
|
|
} |
2591
|
|
|
|
2592
|
|
|
return function( draggable, droppable, toleranceMode, event ) { |
2593
|
|
|
|
2594
|
|
|
if ( !droppable.offset ) { |
2595
|
|
|
return false; |
2596
|
|
|
} |
2597
|
|
|
|
2598
|
|
|
var x1 = ( draggable.positionAbs || |
2599
|
|
|
draggable.position.absolute ).left + draggable.margins.left, |
2600
|
|
|
y1 = ( draggable.positionAbs || |
2601
|
|
|
draggable.position.absolute ).top + draggable.margins.top, |
2602
|
|
|
x2 = x1 + draggable.helperProportions.width, |
2603
|
|
|
y2 = y1 + draggable.helperProportions.height, |
2604
|
|
|
l = droppable.offset.left, |
2605
|
|
|
t = droppable.offset.top, |
2606
|
|
|
r = l + droppable.proportions().width, |
2607
|
|
|
b = t + droppable.proportions().height; |
2608
|
|
|
|
2609
|
|
|
switch ( toleranceMode ) { |
2610
|
|
|
case "fit": |
2611
|
|
|
return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b ); |
2612
|
|
|
case "intersect": |
2613
|
|
|
return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half |
2614
|
|
|
x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half |
2615
|
|
|
t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half |
2616
|
|
|
y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half |
2617
|
|
|
case "pointer": |
2618
|
|
|
return isOverAxis( event.pageY, t, droppable.proportions().height ) && |
2619
|
|
|
isOverAxis( event.pageX, l, droppable.proportions().width ); |
2620
|
|
|
case "touch": |
2621
|
|
|
return ( |
2622
|
|
|
( y1 >= t && y1 <= b ) || // Top edge touching |
2623
|
|
|
( y2 >= t && y2 <= b ) || // Bottom edge touching |
2624
|
|
|
( y1 < t && y2 > b ) // Surrounded vertically |
2625
|
|
|
) && ( |
2626
|
|
|
( x1 >= l && x1 <= r ) || // Left edge touching |
2627
|
|
|
( x2 >= l && x2 <= r ) || // Right edge touching |
2628
|
|
|
( x1 < l && x2 > r ) // Surrounded horizontally |
2629
|
|
|
); |
2630
|
|
|
default: |
2631
|
|
|
return false; |
2632
|
|
|
} |
2633
|
|
|
}; |
2634
|
|
|
} )(); |
2635
|
|
|
|
2636
|
|
|
/* |
2637
|
|
|
This manager tracks offsets of draggables and droppables |
2638
|
|
|
*/ |
2639
|
|
|
$.ui.ddmanager = { |
2640
|
|
|
current: null, |
2641
|
|
|
droppables: { "default": [] }, |
2642
|
|
|
prepareOffsets: function( t, event ) { |
2643
|
|
|
|
2644
|
|
|
var i, j, |
2645
|
|
|
m = $.ui.ddmanager.droppables[ t.options.scope ] || [], |
2646
|
|
|
type = event ? event.type : null, // workaround for #2317 |
2647
|
|
|
list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack(); |
2648
|
|
|
|
2649
|
|
|
droppablesLoop: for ( i = 0; i < m.length; i++ ) { |
2650
|
|
|
|
2651
|
|
|
// No disabled and non-accepted |
2652
|
|
|
if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], |
2653
|
|
|
( t.currentItem || t.element ) ) ) ) { |
2654
|
|
|
continue; |
2655
|
|
|
} |
2656
|
|
|
|
2657
|
|
|
// Filter out elements in the current dragged item |
2658
|
|
|
for ( j = 0; j < list.length; j++ ) { |
2659
|
|
|
if ( list[ j ] === m[ i ].element[ 0 ] ) { |
2660
|
|
|
m[ i ].proportions().height = 0; |
2661
|
|
|
continue droppablesLoop; |
2662
|
|
|
} |
2663
|
|
|
} |
2664
|
|
|
|
2665
|
|
|
m[ i ].visible = m[ i ].element.css( "display" ) !== "none"; |
2666
|
|
|
if ( !m[ i ].visible ) { |
2667
|
|
|
continue; |
2668
|
|
|
} |
2669
|
|
|
|
2670
|
|
|
// Activate the droppable if used directly from draggables |
2671
|
|
|
if ( type === "mousedown" ) { |
2672
|
|
|
m[ i ]._activate.call( m[ i ], event ); |
2673
|
|
|
} |
2674
|
|
|
|
2675
|
|
|
m[ i ].offset = m[ i ].element.offset(); |
2676
|
|
|
m[ i ].proportions( { |
2677
|
|
|
width: m[ i ].element[ 0 ].offsetWidth, |
2678
|
|
|
height: m[ i ].element[ 0 ].offsetHeight |
2679
|
|
|
} ); |
2680
|
|
|
|
2681
|
|
|
} |
2682
|
|
|
|
2683
|
|
|
}, |
2684
|
|
|
drop: function( draggable, event ) { |
2685
|
|
|
|
2686
|
|
|
var dropped = false; |
2687
|
|
|
|
2688
|
|
|
// Create a copy of the droppables in case the list changes during the drop (#9116) |
2689
|
|
|
$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() { |
2690
|
|
|
|
2691
|
|
|
if ( !this.options ) { |
2692
|
|
|
return; |
2693
|
|
|
} |
2694
|
|
|
if ( !this.options.disabled && this.visible && |
2695
|
|
|
intersect( draggable, this, this.options.tolerance, event ) ) { |
2696
|
|
|
dropped = this._drop.call( this, event ) || dropped; |
2697
|
|
|
} |
2698
|
|
|
|
2699
|
|
|
if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], |
2700
|
|
|
( draggable.currentItem || draggable.element ) ) ) { |
2701
|
|
|
this.isout = true; |
2702
|
|
|
this.isover = false; |
2703
|
|
|
this._deactivate.call( this, event ); |
2704
|
|
|
} |
2705
|
|
|
|
2706
|
|
|
} ); |
2707
|
|
|
return dropped; |
2708
|
|
|
|
2709
|
|
|
}, |
2710
|
|
|
dragStart: function( draggable, event ) { |
2711
|
|
|
|
2712
|
|
|
// Listen for scrolling so that if the dragging causes scrolling the position of the |
2713
|
|
|
// droppables can be recalculated (see #5003) |
2714
|
|
|
draggable.element.parentsUntil( "body" ).on( "scroll.droppable", function() { |
2715
|
|
|
if ( !draggable.options.refreshPositions ) { |
2716
|
|
|
$.ui.ddmanager.prepareOffsets( draggable, event ); |
2717
|
|
|
} |
2718
|
|
|
} ); |
2719
|
|
|
}, |
2720
|
|
|
drag: function( draggable, event ) { |
2721
|
|
|
|
2722
|
|
|
// If you have a highly dynamic page, you might try this option. It renders positions |
2723
|
|
|
// every time you move the mouse. |
2724
|
|
|
if ( draggable.options.refreshPositions ) { |
2725
|
|
|
$.ui.ddmanager.prepareOffsets( draggable, event ); |
2726
|
|
|
} |
2727
|
|
|
|
2728
|
|
|
// Run through all droppables and check their positions based on specific tolerance options |
2729
|
|
|
$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() { |
2730
|
|
|
|
2731
|
|
|
if ( this.options.disabled || this.greedyChild || !this.visible ) { |
2732
|
|
|
return; |
2733
|
|
|
} |
2734
|
|
|
|
2735
|
|
|
var parentInstance, scope, parent, |
2736
|
|
|
intersects = intersect( draggable, this, this.options.tolerance, event ), |
2737
|
|
|
c = !intersects && this.isover ? |
2738
|
|
|
"isout" : |
2739
|
|
|
( intersects && !this.isover ? "isover" : null ); |
2740
|
|
|
if ( !c ) { |
2741
|
|
|
return; |
2742
|
|
|
} |
2743
|
|
|
|
2744
|
|
|
if ( this.options.greedy ) { |
2745
|
|
|
|
2746
|
|
|
// find droppable parents with same scope |
2747
|
|
|
scope = this.options.scope; |
2748
|
|
|
parent = this.element.parents( ":data(ui-droppable)" ).filter( function() { |
2749
|
|
|
return $( this ).droppable( "instance" ).options.scope === scope; |
2750
|
|
|
} ); |
2751
|
|
|
|
2752
|
|
|
if ( parent.length ) { |
2753
|
|
|
parentInstance = $( parent[ 0 ] ).droppable( "instance" ); |
2754
|
|
|
parentInstance.greedyChild = ( c === "isover" ); |
2755
|
|
|
} |
2756
|
|
|
} |
2757
|
|
|
|
2758
|
|
|
// We just moved into a greedy child |
2759
|
|
|
if ( parentInstance && c === "isover" ) { |
2760
|
|
|
parentInstance.isover = false; |
2761
|
|
|
parentInstance.isout = true; |
2762
|
|
|
parentInstance._out.call( parentInstance, event ); |
2763
|
|
|
} |
2764
|
|
|
|
2765
|
|
|
this[ c ] = true; |
2766
|
|
|
this[ c === "isout" ? "isover" : "isout" ] = false; |
2767
|
|
|
this[ c === "isover" ? "_over" : "_out" ].call( this, event ); |
2768
|
|
|
|
2769
|
|
|
// We just moved out of a greedy child |
2770
|
|
|
if ( parentInstance && c === "isout" ) { |
2771
|
|
|
parentInstance.isout = false; |
2772
|
|
|
parentInstance.isover = true; |
2773
|
|
|
parentInstance._over.call( parentInstance, event ); |
2774
|
|
|
} |
2775
|
|
|
} ); |
2776
|
|
|
|
2777
|
|
|
}, |
2778
|
|
|
dragStop: function( draggable, event ) { |
2779
|
|
|
draggable.element.parentsUntil( "body" ).off( "scroll.droppable" ); |
2780
|
|
|
|
2781
|
|
|
// Call prepareOffsets one final time since IE does not fire return scroll events when |
2782
|
|
|
// overflow was caused by drag (see #5003) |
2783
|
|
|
if ( !draggable.options.refreshPositions ) { |
2784
|
|
|
$.ui.ddmanager.prepareOffsets( draggable, event ); |
2785
|
|
|
} |
2786
|
|
|
} |
2787
|
|
|
}; |
2788
|
|
|
|
2789
|
|
|
// DEPRECATED |
2790
|
|
|
// TODO: switch return back to widget declaration at top of file when this is removed |
2791
|
|
|
if ( $.uiBackCompat !== false ) { |
2792
|
|
|
|
2793
|
|
|
// Backcompat for activeClass and hoverClass options |
2794
|
|
|
$.widget( "ui.droppable", $.ui.droppable, { |
2795
|
|
|
options: { |
2796
|
|
|
hoverClass: false, |
2797
|
|
|
activeClass: false |
2798
|
|
|
}, |
2799
|
|
|
_addActiveClass: function() { |
2800
|
|
|
this._super(); |
2801
|
|
|
if ( this.options.activeClass ) { |
2802
|
|
|
this.element.addClass( this.options.activeClass ); |
2803
|
|
|
} |
2804
|
|
|
}, |
2805
|
|
|
_removeActiveClass: function() { |
2806
|
|
|
this._super(); |
2807
|
|
|
if ( this.options.activeClass ) { |
2808
|
|
|
this.element.removeClass( this.options.activeClass ); |
2809
|
|
|
} |
2810
|
|
|
}, |
2811
|
|
|
_addHoverClass: function() { |
2812
|
|
|
this._super(); |
2813
|
|
|
if ( this.options.hoverClass ) { |
2814
|
|
|
this.element.addClass( this.options.hoverClass ); |
2815
|
|
|
} |
2816
|
|
|
}, |
2817
|
|
|
_removeHoverClass: function() { |
2818
|
|
|
this._super(); |
2819
|
|
|
if ( this.options.hoverClass ) { |
2820
|
|
|
this.element.removeClass( this.options.hoverClass ); |
2821
|
|
|
} |
2822
|
|
|
} |
2823
|
|
|
} ); |
2824
|
|
|
} |
2825
|
|
|
|
2826
|
|
|
var widgetsDroppable = $.ui.droppable; |
|
|
|
|
2827
|
|
|
|
2828
|
|
|
|
2829
|
|
|
/*! |
2830
|
|
|
* jQuery UI Resizable 1.12.0 |
2831
|
|
|
* http://jqueryui.com |
2832
|
|
|
* |
2833
|
|
|
* Copyright jQuery Foundation and other contributors |
2834
|
|
|
* Released under the MIT license. |
2835
|
|
|
* http://jquery.org/license |
2836
|
|
|
*/ |
2837
|
|
|
|
2838
|
|
|
//>>label: Resizable |
2839
|
|
|
//>>group: Interactions |
2840
|
|
|
//>>description: Enables resize functionality for any element. |
2841
|
|
|
//>>docs: http://api.jqueryui.com/resizable/ |
2842
|
|
|
//>>demos: http://jqueryui.com/resizable/ |
2843
|
|
|
//>>css.structure: ../../themes/base/core.css |
2844
|
|
|
//>>css.structure: ../../themes/base/resizable.css |
2845
|
|
|
//>>css.theme: ../../themes/base/theme.css |
2846
|
|
|
|
2847
|
|
|
|
2848
|
|
|
|
2849
|
|
|
$.widget( "ui.resizable", $.ui.mouse, { |
2850
|
|
|
version: "1.12.0", |
2851
|
|
|
widgetEventPrefix: "resize", |
2852
|
|
|
options: { |
2853
|
|
|
alsoResize: false, |
2854
|
|
|
animate: false, |
2855
|
|
|
animateDuration: "slow", |
2856
|
|
|
animateEasing: "swing", |
2857
|
|
|
aspectRatio: false, |
2858
|
|
|
autoHide: false, |
2859
|
|
|
classes: { |
2860
|
|
|
"ui-resizable-se": "ui-icon ui-icon-gripsmall-diagonal-se" |
2861
|
|
|
}, |
2862
|
|
|
containment: false, |
2863
|
|
|
ghost: false, |
2864
|
|
|
grid: false, |
2865
|
|
|
handles: "e,s,se", |
2866
|
|
|
helper: false, |
2867
|
|
|
maxHeight: null, |
2868
|
|
|
maxWidth: null, |
2869
|
|
|
minHeight: 10, |
2870
|
|
|
minWidth: 10, |
2871
|
|
|
|
2872
|
|
|
// See #7960 |
2873
|
|
|
zIndex: 90, |
2874
|
|
|
|
2875
|
|
|
// Callbacks |
2876
|
|
|
resize: null, |
2877
|
|
|
start: null, |
2878
|
|
|
stop: null |
2879
|
|
|
}, |
2880
|
|
|
|
2881
|
|
|
_num: function( value ) { |
2882
|
|
|
return parseFloat( value ) || 0; |
2883
|
|
|
}, |
2884
|
|
|
|
2885
|
|
|
_isNumber: function( value ) { |
2886
|
|
|
return !isNaN( parseFloat( value ) ); |
2887
|
|
|
}, |
2888
|
|
|
|
2889
|
|
|
_hasScroll: function( el, a ) { |
2890
|
|
|
|
2891
|
|
|
if ( $( el ).css( "overflow" ) === "hidden" ) { |
2892
|
|
|
return false; |
2893
|
|
|
} |
2894
|
|
|
|
2895
|
|
|
var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop", |
2896
|
|
|
has = false; |
|
|
|
|
2897
|
|
|
|
2898
|
|
|
if ( el[ scroll ] > 0 ) { |
2899
|
|
|
return true; |
2900
|
|
|
} |
2901
|
|
|
|
2902
|
|
|
// TODO: determine which cases actually cause this to happen |
2903
|
|
|
// if the element doesn't have the scroll set, see if it's possible to |
2904
|
|
|
// set the scroll |
2905
|
|
|
el[ scroll ] = 1; |
2906
|
|
|
has = ( el[ scroll ] > 0 ); |
2907
|
|
|
el[ scroll ] = 0; |
2908
|
|
|
return has; |
2909
|
|
|
}, |
2910
|
|
|
|
2911
|
|
|
_create: function() { |
2912
|
|
|
|
2913
|
|
|
var margins, |
2914
|
|
|
o = this.options, |
2915
|
|
|
that = this; |
2916
|
|
|
this._addClass( "ui-resizable" ); |
2917
|
|
|
|
2918
|
|
|
$.extend( this, { |
2919
|
|
|
_aspectRatio: !!( o.aspectRatio ), |
2920
|
|
|
aspectRatio: o.aspectRatio, |
2921
|
|
|
originalElement: this.element, |
2922
|
|
|
_proportionallyResizeElements: [], |
2923
|
|
|
_helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null |
2924
|
|
|
} ); |
2925
|
|
|
|
2926
|
|
|
// Wrap the element if it cannot hold child nodes |
2927
|
|
|
if ( this.element[ 0 ].nodeName.match( /^(canvas|textarea|input|select|button|img)$/i ) ) { |
2928
|
|
|
|
2929
|
|
|
this.element.wrap( |
2930
|
|
|
$( "<div class='ui-wrapper' style='overflow: hidden;'></div>" ).css( { |
2931
|
|
|
position: this.element.css( "position" ), |
2932
|
|
|
width: this.element.outerWidth(), |
2933
|
|
|
height: this.element.outerHeight(), |
2934
|
|
|
top: this.element.css( "top" ), |
2935
|
|
|
left: this.element.css( "left" ) |
2936
|
|
|
} ) |
2937
|
|
|
); |
2938
|
|
|
|
2939
|
|
|
this.element = this.element.parent().data( |
2940
|
|
|
"ui-resizable", this.element.resizable( "instance" ) |
2941
|
|
|
); |
2942
|
|
|
|
2943
|
|
|
this.elementIsWrapper = true; |
2944
|
|
|
|
2945
|
|
|
margins = { |
2946
|
|
|
marginTop: this.originalElement.css( "marginTop" ), |
2947
|
|
|
marginRight: this.originalElement.css( "marginRight" ), |
2948
|
|
|
marginBottom: this.originalElement.css( "marginBottom" ), |
2949
|
|
|
marginLeft: this.originalElement.css( "marginLeft" ) |
2950
|
|
|
}; |
2951
|
|
|
|
2952
|
|
|
this.element.css( margins ); |
2953
|
|
|
this.originalElement.css( "margin", 0 ); |
2954
|
|
|
|
2955
|
|
|
// support: Safari |
2956
|
|
|
// Prevent Safari textarea resize |
2957
|
|
|
this.originalResizeStyle = this.originalElement.css( "resize" ); |
2958
|
|
|
this.originalElement.css( "resize", "none" ); |
2959
|
|
|
|
2960
|
|
|
this._proportionallyResizeElements.push( this.originalElement.css( { |
2961
|
|
|
position: "static", |
2962
|
|
|
zoom: 1, |
2963
|
|
|
display: "block" |
2964
|
|
|
} ) ); |
2965
|
|
|
|
2966
|
|
|
// Support: IE9 |
2967
|
|
|
// avoid IE jump (hard set the margin) |
2968
|
|
|
this.originalElement.css( margins ); |
2969
|
|
|
|
2970
|
|
|
this._proportionallyResize(); |
2971
|
|
|
} |
2972
|
|
|
|
2973
|
|
|
this._setupHandles(); |
2974
|
|
|
|
2975
|
|
|
if ( o.autoHide ) { |
2976
|
|
|
$( this.element ) |
2977
|
|
|
.on( "mouseenter", function() { |
2978
|
|
|
if ( o.disabled ) { |
2979
|
|
|
return; |
2980
|
|
|
} |
2981
|
|
|
that._removeClass( "ui-resizable-autohide" ); |
2982
|
|
|
that._handles.show(); |
2983
|
|
|
} ) |
2984
|
|
|
.on( "mouseleave", function() { |
2985
|
|
|
if ( o.disabled ) { |
2986
|
|
|
return; |
2987
|
|
|
} |
2988
|
|
|
if ( !that.resizing ) { |
2989
|
|
|
that._addClass( "ui-resizable-autohide" ); |
2990
|
|
|
that._handles.hide(); |
2991
|
|
|
} |
2992
|
|
|
} ); |
2993
|
|
|
} |
2994
|
|
|
|
2995
|
|
|
this._mouseInit(); |
2996
|
|
|
}, |
2997
|
|
|
|
2998
|
|
|
_destroy: function() { |
2999
|
|
|
|
3000
|
|
|
this._mouseDestroy(); |
3001
|
|
|
|
3002
|
|
|
var wrapper, |
3003
|
|
|
_destroy = function( exp ) { |
3004
|
|
|
$( exp ) |
3005
|
|
|
.removeData( "resizable" ) |
3006
|
|
|
.removeData( "ui-resizable" ) |
3007
|
|
|
.off( ".resizable" ) |
3008
|
|
|
.find( ".ui-resizable-handle" ) |
3009
|
|
|
.remove(); |
3010
|
|
|
}; |
3011
|
|
|
|
3012
|
|
|
// TODO: Unwrap at same DOM position |
3013
|
|
|
if ( this.elementIsWrapper ) { |
3014
|
|
|
_destroy( this.element ); |
3015
|
|
|
wrapper = this.element; |
3016
|
|
|
this.originalElement.css( { |
3017
|
|
|
position: wrapper.css( "position" ), |
3018
|
|
|
width: wrapper.outerWidth(), |
3019
|
|
|
height: wrapper.outerHeight(), |
3020
|
|
|
top: wrapper.css( "top" ), |
3021
|
|
|
left: wrapper.css( "left" ) |
3022
|
|
|
} ).insertAfter( wrapper ); |
3023
|
|
|
wrapper.remove(); |
3024
|
|
|
} |
3025
|
|
|
|
3026
|
|
|
this.originalElement.css( "resize", this.originalResizeStyle ); |
3027
|
|
|
_destroy( this.originalElement ); |
3028
|
|
|
|
3029
|
|
|
return this; |
3030
|
|
|
}, |
3031
|
|
|
|
3032
|
|
|
_setOption: function( key, value ) { |
3033
|
|
|
this._super( key, value ); |
3034
|
|
|
|
3035
|
|
|
switch ( key ) { |
3036
|
|
|
case "handles": |
3037
|
|
|
this._removeHandles(); |
3038
|
|
|
this._setupHandles(); |
3039
|
|
|
break; |
3040
|
|
|
default: |
3041
|
|
|
break; |
3042
|
|
|
} |
3043
|
|
|
}, |
3044
|
|
|
|
3045
|
|
|
_setupHandles: function() { |
3046
|
|
|
var o = this.options, handle, i, n, hname, axis, that = this; |
3047
|
|
|
this.handles = o.handles || |
3048
|
|
|
( !$( ".ui-resizable-handle", this.element ).length ? |
3049
|
|
|
"e,s,se" : { |
3050
|
|
|
n: ".ui-resizable-n", |
3051
|
|
|
e: ".ui-resizable-e", |
3052
|
|
|
s: ".ui-resizable-s", |
3053
|
|
|
w: ".ui-resizable-w", |
3054
|
|
|
se: ".ui-resizable-se", |
3055
|
|
|
sw: ".ui-resizable-sw", |
3056
|
|
|
ne: ".ui-resizable-ne", |
3057
|
|
|
nw: ".ui-resizable-nw" |
3058
|
|
|
} ); |
3059
|
|
|
|
3060
|
|
|
this._handles = $(); |
3061
|
|
|
if ( this.handles.constructor === String ) { |
3062
|
|
|
|
3063
|
|
|
if ( this.handles === "all" ) { |
3064
|
|
|
this.handles = "n,e,s,w,se,sw,ne,nw"; |
3065
|
|
|
} |
3066
|
|
|
|
3067
|
|
|
n = this.handles.split( "," ); |
3068
|
|
|
this.handles = {}; |
3069
|
|
|
|
3070
|
|
|
for ( i = 0; i < n.length; i++ ) { |
3071
|
|
|
|
3072
|
|
|
handle = $.trim( n[ i ] ); |
3073
|
|
|
hname = "ui-resizable-" + handle; |
3074
|
|
|
axis = $( "<div>" ); |
3075
|
|
|
this._addClass( axis, "ui-resizable-handle " + hname ); |
3076
|
|
|
|
3077
|
|
|
axis.css( { zIndex: o.zIndex } ); |
3078
|
|
|
|
3079
|
|
|
this.handles[ handle ] = ".ui-resizable-" + handle; |
3080
|
|
|
this.element.append( axis ); |
3081
|
|
|
} |
3082
|
|
|
|
3083
|
|
|
} |
3084
|
|
|
|
3085
|
|
|
this._renderAxis = function( target ) { |
3086
|
|
|
|
3087
|
|
|
var i, axis, padPos, padWrapper; |
3088
|
|
|
|
3089
|
|
|
target = target || this.element; |
3090
|
|
|
|
3091
|
|
|
for ( i in this.handles ) { |
3092
|
|
|
|
3093
|
|
|
if ( this.handles[ i ].constructor === String ) { |
3094
|
|
|
this.handles[ i ] = this.element.children( this.handles[ i ] ).first().show(); |
3095
|
|
|
} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) { |
3096
|
|
|
this.handles[ i ] = $( this.handles[ i ] ); |
3097
|
|
|
this._on( this.handles[ i ], { "mousedown": that._mouseDown } ); |
3098
|
|
|
} |
3099
|
|
|
|
3100
|
|
|
if ( this.elementIsWrapper && |
3101
|
|
|
this.originalElement[ 0 ] |
3102
|
|
|
.nodeName |
3103
|
|
|
.match( /^(textarea|input|select|button)$/i ) ) { |
3104
|
|
|
axis = $( this.handles[ i ], this.element ); |
3105
|
|
|
|
3106
|
|
|
padWrapper = /sw|ne|nw|se|n|s/.test( i ) ? |
3107
|
|
|
axis.outerHeight() : |
3108
|
|
|
axis.outerWidth(); |
3109
|
|
|
|
3110
|
|
|
padPos = [ "padding", |
3111
|
|
|
/ne|nw|n/.test( i ) ? "Top" : |
3112
|
|
|
/se|sw|s/.test( i ) ? "Bottom" : |
3113
|
|
|
/^e$/.test( i ) ? "Right" : "Left" ].join( "" ); |
3114
|
|
|
|
3115
|
|
|
target.css( padPos, padWrapper ); |
3116
|
|
|
|
3117
|
|
|
this._proportionallyResize(); |
3118
|
|
|
} |
3119
|
|
|
|
3120
|
|
|
this._handles = this._handles.add( this.handles[ i ] ); |
3121
|
|
|
} |
3122
|
|
|
}; |
3123
|
|
|
|
3124
|
|
|
// TODO: make renderAxis a prototype function |
3125
|
|
|
this._renderAxis( this.element ); |
3126
|
|
|
|
3127
|
|
|
this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) ); |
3128
|
|
|
this._handles.disableSelection(); |
3129
|
|
|
|
3130
|
|
|
this._handles.on( "mouseover", function() { |
3131
|
|
|
if ( !that.resizing ) { |
3132
|
|
|
if ( this.className ) { |
3133
|
|
|
axis = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i ); |
3134
|
|
|
} |
3135
|
|
|
that.axis = axis && axis[ 1 ] ? axis[ 1 ] : "se"; |
|
|
|
|
3136
|
|
|
} |
3137
|
|
|
} ); |
3138
|
|
|
|
3139
|
|
|
if ( o.autoHide ) { |
3140
|
|
|
this._handles.hide(); |
3141
|
|
|
this._addClass( "ui-resizable-autohide" ); |
3142
|
|
|
} |
3143
|
|
|
}, |
3144
|
|
|
|
3145
|
|
|
_removeHandles: function() { |
3146
|
|
|
this._handles.remove(); |
3147
|
|
|
}, |
3148
|
|
|
|
3149
|
|
|
_mouseCapture: function( event ) { |
3150
|
|
|
var i, handle, |
3151
|
|
|
capture = false; |
3152
|
|
|
|
3153
|
|
|
for ( i in this.handles ) { |
3154
|
|
|
handle = $( this.handles[ i ] )[ 0 ]; |
3155
|
|
|
if ( handle === event.target || $.contains( handle, event.target ) ) { |
3156
|
|
|
capture = true; |
3157
|
|
|
} |
3158
|
|
|
} |
3159
|
|
|
|
3160
|
|
|
return !this.options.disabled && capture; |
3161
|
|
|
}, |
3162
|
|
|
|
3163
|
|
|
_mouseStart: function( event ) { |
3164
|
|
|
|
3165
|
|
|
var curleft, curtop, cursor, |
3166
|
|
|
o = this.options, |
3167
|
|
|
el = this.element; |
3168
|
|
|
|
3169
|
|
|
this.resizing = true; |
3170
|
|
|
|
3171
|
|
|
this._renderProxy(); |
3172
|
|
|
|
3173
|
|
|
curleft = this._num( this.helper.css( "left" ) ); |
3174
|
|
|
curtop = this._num( this.helper.css( "top" ) ); |
3175
|
|
|
|
3176
|
|
|
if ( o.containment ) { |
3177
|
|
|
curleft += $( o.containment ).scrollLeft() || 0; |
3178
|
|
|
curtop += $( o.containment ).scrollTop() || 0; |
3179
|
|
|
} |
3180
|
|
|
|
3181
|
|
|
this.offset = this.helper.offset(); |
3182
|
|
|
this.position = { left: curleft, top: curtop }; |
3183
|
|
|
|
3184
|
|
|
this.size = this._helper ? { |
3185
|
|
|
width: this.helper.width(), |
3186
|
|
|
height: this.helper.height() |
3187
|
|
|
} : { |
3188
|
|
|
width: el.width(), |
3189
|
|
|
height: el.height() |
3190
|
|
|
}; |
3191
|
|
|
|
3192
|
|
|
this.originalSize = this._helper ? { |
3193
|
|
|
width: el.outerWidth(), |
3194
|
|
|
height: el.outerHeight() |
3195
|
|
|
} : { |
3196
|
|
|
width: el.width(), |
3197
|
|
|
height: el.height() |
3198
|
|
|
}; |
3199
|
|
|
|
3200
|
|
|
this.sizeDiff = { |
3201
|
|
|
width: el.outerWidth() - el.width(), |
3202
|
|
|
height: el.outerHeight() - el.height() |
3203
|
|
|
}; |
3204
|
|
|
|
3205
|
|
|
this.originalPosition = { left: curleft, top: curtop }; |
3206
|
|
|
this.originalMousePosition = { left: event.pageX, top: event.pageY }; |
3207
|
|
|
|
3208
|
|
|
this.aspectRatio = ( typeof o.aspectRatio === "number" ) ? |
3209
|
|
|
o.aspectRatio : |
3210
|
|
|
( ( this.originalSize.width / this.originalSize.height ) || 1 ); |
3211
|
|
|
|
3212
|
|
|
cursor = $( ".ui-resizable-" + this.axis ).css( "cursor" ); |
3213
|
|
|
$( "body" ).css( "cursor", cursor === "auto" ? this.axis + "-resize" : cursor ); |
3214
|
|
|
|
3215
|
|
|
this._addClass( "ui-resizable-resizing" ); |
3216
|
|
|
this._propagate( "start", event ); |
3217
|
|
|
return true; |
3218
|
|
|
}, |
3219
|
|
|
|
3220
|
|
|
_mouseDrag: function( event ) { |
3221
|
|
|
|
3222
|
|
|
var data, props, |
3223
|
|
|
smp = this.originalMousePosition, |
3224
|
|
|
a = this.axis, |
3225
|
|
|
dx = ( event.pageX - smp.left ) || 0, |
3226
|
|
|
dy = ( event.pageY - smp.top ) || 0, |
3227
|
|
|
trigger = this._change[ a ]; |
3228
|
|
|
|
3229
|
|
|
this._updatePrevProperties(); |
3230
|
|
|
|
3231
|
|
|
if ( !trigger ) { |
3232
|
|
|
return false; |
3233
|
|
|
} |
3234
|
|
|
|
3235
|
|
|
data = trigger.apply( this, [ event, dx, dy ] ); |
3236
|
|
|
|
3237
|
|
|
this._updateVirtualBoundaries( event.shiftKey ); |
3238
|
|
|
if ( this._aspectRatio || event.shiftKey ) { |
3239
|
|
|
data = this._updateRatio( data, event ); |
3240
|
|
|
} |
3241
|
|
|
|
3242
|
|
|
data = this._respectSize( data, event ); |
3243
|
|
|
|
3244
|
|
|
this._updateCache( data ); |
3245
|
|
|
|
3246
|
|
|
this._propagate( "resize", event ); |
3247
|
|
|
|
3248
|
|
|
props = this._applyChanges(); |
3249
|
|
|
|
3250
|
|
|
if ( !this._helper && this._proportionallyResizeElements.length ) { |
3251
|
|
|
this._proportionallyResize(); |
3252
|
|
|
} |
3253
|
|
|
|
3254
|
|
|
if ( !$.isEmptyObject( props ) ) { |
3255
|
|
|
this._updatePrevProperties(); |
3256
|
|
|
this._trigger( "resize", event, this.ui() ); |
3257
|
|
|
this._applyChanges(); |
3258
|
|
|
} |
3259
|
|
|
|
3260
|
|
|
return false; |
3261
|
|
|
}, |
3262
|
|
|
|
3263
|
|
|
_mouseStop: function( event ) { |
3264
|
|
|
|
3265
|
|
|
this.resizing = false; |
3266
|
|
|
var pr, ista, soffseth, soffsetw, s, left, top, |
3267
|
|
|
o = this.options, that = this; |
3268
|
|
|
|
3269
|
|
|
if ( this._helper ) { |
3270
|
|
|
|
3271
|
|
|
pr = this._proportionallyResizeElements; |
3272
|
|
|
ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ); |
3273
|
|
|
soffseth = ista && this._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height; |
3274
|
|
|
soffsetw = ista ? 0 : that.sizeDiff.width; |
3275
|
|
|
|
3276
|
|
|
s = { |
3277
|
|
|
width: ( that.helper.width() - soffsetw ), |
3278
|
|
|
height: ( that.helper.height() - soffseth ) |
3279
|
|
|
}; |
3280
|
|
|
left = ( parseFloat( that.element.css( "left" ) ) + |
3281
|
|
|
( that.position.left - that.originalPosition.left ) ) || null; |
3282
|
|
|
top = ( parseFloat( that.element.css( "top" ) ) + |
3283
|
|
|
( that.position.top - that.originalPosition.top ) ) || null; |
3284
|
|
|
|
3285
|
|
|
if ( !o.animate ) { |
3286
|
|
|
this.element.css( $.extend( s, { top: top, left: left } ) ); |
3287
|
|
|
} |
3288
|
|
|
|
3289
|
|
|
that.helper.height( that.size.height ); |
3290
|
|
|
that.helper.width( that.size.width ); |
3291
|
|
|
|
3292
|
|
|
if ( this._helper && !o.animate ) { |
3293
|
|
|
this._proportionallyResize(); |
3294
|
|
|
} |
3295
|
|
|
} |
3296
|
|
|
|
3297
|
|
|
$( "body" ).css( "cursor", "auto" ); |
3298
|
|
|
|
3299
|
|
|
this._removeClass( "ui-resizable-resizing" ); |
3300
|
|
|
|
3301
|
|
|
this._propagate( "stop", event ); |
3302
|
|
|
|
3303
|
|
|
if ( this._helper ) { |
3304
|
|
|
this.helper.remove(); |
3305
|
|
|
} |
3306
|
|
|
|
3307
|
|
|
return false; |
3308
|
|
|
|
3309
|
|
|
}, |
3310
|
|
|
|
3311
|
|
|
_updatePrevProperties: function() { |
3312
|
|
|
this.prevPosition = { |
3313
|
|
|
top: this.position.top, |
3314
|
|
|
left: this.position.left |
3315
|
|
|
}; |
3316
|
|
|
this.prevSize = { |
3317
|
|
|
width: this.size.width, |
3318
|
|
|
height: this.size.height |
3319
|
|
|
}; |
3320
|
|
|
}, |
3321
|
|
|
|
3322
|
|
|
_applyChanges: function() { |
3323
|
|
|
var props = {}; |
3324
|
|
|
|
3325
|
|
|
if ( this.position.top !== this.prevPosition.top ) { |
3326
|
|
|
props.top = this.position.top + "px"; |
3327
|
|
|
} |
3328
|
|
|
if ( this.position.left !== this.prevPosition.left ) { |
3329
|
|
|
props.left = this.position.left + "px"; |
3330
|
|
|
} |
3331
|
|
|
if ( this.size.width !== this.prevSize.width ) { |
3332
|
|
|
props.width = this.size.width + "px"; |
3333
|
|
|
} |
3334
|
|
|
if ( this.size.height !== this.prevSize.height ) { |
3335
|
|
|
props.height = this.size.height + "px"; |
3336
|
|
|
} |
3337
|
|
|
|
3338
|
|
|
this.helper.css( props ); |
3339
|
|
|
|
3340
|
|
|
return props; |
3341
|
|
|
}, |
3342
|
|
|
|
3343
|
|
|
_updateVirtualBoundaries: function( forceAspectRatio ) { |
3344
|
|
|
var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b, |
3345
|
|
|
o = this.options; |
3346
|
|
|
|
3347
|
|
|
b = { |
3348
|
|
|
minWidth: this._isNumber( o.minWidth ) ? o.minWidth : 0, |
3349
|
|
|
maxWidth: this._isNumber( o.maxWidth ) ? o.maxWidth : Infinity, |
3350
|
|
|
minHeight: this._isNumber( o.minHeight ) ? o.minHeight : 0, |
3351
|
|
|
maxHeight: this._isNumber( o.maxHeight ) ? o.maxHeight : Infinity |
3352
|
|
|
}; |
3353
|
|
|
|
3354
|
|
|
if ( this._aspectRatio || forceAspectRatio ) { |
3355
|
|
|
pMinWidth = b.minHeight * this.aspectRatio; |
3356
|
|
|
pMinHeight = b.minWidth / this.aspectRatio; |
3357
|
|
|
pMaxWidth = b.maxHeight * this.aspectRatio; |
3358
|
|
|
pMaxHeight = b.maxWidth / this.aspectRatio; |
3359
|
|
|
|
3360
|
|
|
if ( pMinWidth > b.minWidth ) { |
3361
|
|
|
b.minWidth = pMinWidth; |
3362
|
|
|
} |
3363
|
|
|
if ( pMinHeight > b.minHeight ) { |
3364
|
|
|
b.minHeight = pMinHeight; |
3365
|
|
|
} |
3366
|
|
|
if ( pMaxWidth < b.maxWidth ) { |
3367
|
|
|
b.maxWidth = pMaxWidth; |
3368
|
|
|
} |
3369
|
|
|
if ( pMaxHeight < b.maxHeight ) { |
3370
|
|
|
b.maxHeight = pMaxHeight; |
3371
|
|
|
} |
3372
|
|
|
} |
3373
|
|
|
this._vBoundaries = b; |
3374
|
|
|
}, |
3375
|
|
|
|
3376
|
|
|
_updateCache: function( data ) { |
3377
|
|
|
this.offset = this.helper.offset(); |
3378
|
|
|
if ( this._isNumber( data.left ) ) { |
3379
|
|
|
this.position.left = data.left; |
3380
|
|
|
} |
3381
|
|
|
if ( this._isNumber( data.top ) ) { |
3382
|
|
|
this.position.top = data.top; |
3383
|
|
|
} |
3384
|
|
|
if ( this._isNumber( data.height ) ) { |
3385
|
|
|
this.size.height = data.height; |
3386
|
|
|
} |
3387
|
|
|
if ( this._isNumber( data.width ) ) { |
3388
|
|
|
this.size.width = data.width; |
3389
|
|
|
} |
3390
|
|
|
}, |
3391
|
|
|
|
3392
|
|
|
_updateRatio: function( data ) { |
3393
|
|
|
|
3394
|
|
|
var cpos = this.position, |
3395
|
|
|
csize = this.size, |
3396
|
|
|
a = this.axis; |
3397
|
|
|
|
3398
|
|
|
if ( this._isNumber( data.height ) ) { |
3399
|
|
|
data.width = ( data.height * this.aspectRatio ); |
3400
|
|
|
} else if ( this._isNumber( data.width ) ) { |
3401
|
|
|
data.height = ( data.width / this.aspectRatio ); |
3402
|
|
|
} |
3403
|
|
|
|
3404
|
|
|
if ( a === "sw" ) { |
3405
|
|
|
data.left = cpos.left + ( csize.width - data.width ); |
3406
|
|
|
data.top = null; |
3407
|
|
|
} |
3408
|
|
|
if ( a === "nw" ) { |
3409
|
|
|
data.top = cpos.top + ( csize.height - data.height ); |
3410
|
|
|
data.left = cpos.left + ( csize.width - data.width ); |
3411
|
|
|
} |
3412
|
|
|
|
3413
|
|
|
return data; |
3414
|
|
|
}, |
3415
|
|
|
|
3416
|
|
|
_respectSize: function( data ) { |
3417
|
|
|
|
3418
|
|
|
var o = this._vBoundaries, |
3419
|
|
|
a = this.axis, |
3420
|
|
|
ismaxw = this._isNumber( data.width ) && o.maxWidth && ( o.maxWidth < data.width ), |
3421
|
|
|
ismaxh = this._isNumber( data.height ) && o.maxHeight && ( o.maxHeight < data.height ), |
3422
|
|
|
isminw = this._isNumber( data.width ) && o.minWidth && ( o.minWidth > data.width ), |
3423
|
|
|
isminh = this._isNumber( data.height ) && o.minHeight && ( o.minHeight > data.height ), |
3424
|
|
|
dw = this.originalPosition.left + this.originalSize.width, |
3425
|
|
|
dh = this.originalPosition.top + this.originalSize.height, |
3426
|
|
|
cw = /sw|nw|w/.test( a ), ch = /nw|ne|n/.test( a ); |
3427
|
|
|
if ( isminw ) { |
3428
|
|
|
data.width = o.minWidth; |
3429
|
|
|
} |
3430
|
|
|
if ( isminh ) { |
3431
|
|
|
data.height = o.minHeight; |
3432
|
|
|
} |
3433
|
|
|
if ( ismaxw ) { |
3434
|
|
|
data.width = o.maxWidth; |
3435
|
|
|
} |
3436
|
|
|
if ( ismaxh ) { |
3437
|
|
|
data.height = o.maxHeight; |
3438
|
|
|
} |
3439
|
|
|
|
3440
|
|
|
if ( isminw && cw ) { |
3441
|
|
|
data.left = dw - o.minWidth; |
3442
|
|
|
} |
3443
|
|
|
if ( ismaxw && cw ) { |
3444
|
|
|
data.left = dw - o.maxWidth; |
3445
|
|
|
} |
3446
|
|
|
if ( isminh && ch ) { |
3447
|
|
|
data.top = dh - o.minHeight; |
3448
|
|
|
} |
3449
|
|
|
if ( ismaxh && ch ) { |
3450
|
|
|
data.top = dh - o.maxHeight; |
3451
|
|
|
} |
3452
|
|
|
|
3453
|
|
|
// Fixing jump error on top/left - bug #2330 |
3454
|
|
|
if ( !data.width && !data.height && !data.left && data.top ) { |
3455
|
|
|
data.top = null; |
3456
|
|
|
} else if ( !data.width && !data.height && !data.top && data.left ) { |
3457
|
|
|
data.left = null; |
3458
|
|
|
} |
3459
|
|
|
|
3460
|
|
|
return data; |
3461
|
|
|
}, |
3462
|
|
|
|
3463
|
|
|
_getPaddingPlusBorderDimensions: function( element ) { |
3464
|
|
|
var i = 0, |
3465
|
|
|
widths = [], |
3466
|
|
|
borders = [ |
3467
|
|
|
element.css( "borderTopWidth" ), |
3468
|
|
|
element.css( "borderRightWidth" ), |
3469
|
|
|
element.css( "borderBottomWidth" ), |
3470
|
|
|
element.css( "borderLeftWidth" ) |
3471
|
|
|
], |
3472
|
|
|
paddings = [ |
3473
|
|
|
element.css( "paddingTop" ), |
3474
|
|
|
element.css( "paddingRight" ), |
3475
|
|
|
element.css( "paddingBottom" ), |
3476
|
|
|
element.css( "paddingLeft" ) |
3477
|
|
|
]; |
3478
|
|
|
|
3479
|
|
|
for ( ; i < 4; i++ ) { |
3480
|
|
|
widths[ i ] = ( parseFloat( borders[ i ] ) || 0 ); |
3481
|
|
|
widths[ i ] += ( parseFloat( paddings[ i ] ) || 0 ); |
3482
|
|
|
} |
3483
|
|
|
|
3484
|
|
|
return { |
3485
|
|
|
height: widths[ 0 ] + widths[ 2 ], |
3486
|
|
|
width: widths[ 1 ] + widths[ 3 ] |
3487
|
|
|
}; |
3488
|
|
|
}, |
3489
|
|
|
|
3490
|
|
|
_proportionallyResize: function() { |
3491
|
|
|
|
3492
|
|
|
if ( !this._proportionallyResizeElements.length ) { |
3493
|
|
|
return; |
3494
|
|
|
} |
3495
|
|
|
|
3496
|
|
|
var prel, |
3497
|
|
|
i = 0, |
3498
|
|
|
element = this.helper || this.element; |
3499
|
|
|
|
3500
|
|
|
for ( ; i < this._proportionallyResizeElements.length; i++ ) { |
3501
|
|
|
|
3502
|
|
|
prel = this._proportionallyResizeElements[ i ]; |
3503
|
|
|
|
3504
|
|
|
// TODO: Seems like a bug to cache this.outerDimensions |
3505
|
|
|
// considering that we are in a loop. |
3506
|
|
|
if ( !this.outerDimensions ) { |
3507
|
|
|
this.outerDimensions = this._getPaddingPlusBorderDimensions( prel ); |
3508
|
|
|
} |
3509
|
|
|
|
3510
|
|
|
prel.css( { |
3511
|
|
|
height: ( element.height() - this.outerDimensions.height ) || 0, |
3512
|
|
|
width: ( element.width() - this.outerDimensions.width ) || 0 |
3513
|
|
|
} ); |
3514
|
|
|
|
3515
|
|
|
} |
3516
|
|
|
|
3517
|
|
|
}, |
3518
|
|
|
|
3519
|
|
|
_renderProxy: function() { |
3520
|
|
|
|
3521
|
|
|
var el = this.element, o = this.options; |
3522
|
|
|
this.elementOffset = el.offset(); |
3523
|
|
|
|
3524
|
|
|
if ( this._helper ) { |
3525
|
|
|
|
3526
|
|
|
this.helper = this.helper || $( "<div style='overflow:hidden;'></div>" ); |
3527
|
|
|
|
3528
|
|
|
this._addClass( this.helper, this._helper ); |
3529
|
|
|
this.helper.css( { |
3530
|
|
|
width: this.element.outerWidth(), |
3531
|
|
|
height: this.element.outerHeight(), |
3532
|
|
|
position: "absolute", |
3533
|
|
|
left: this.elementOffset.left + "px", |
3534
|
|
|
top: this.elementOffset.top + "px", |
3535
|
|
|
zIndex: ++o.zIndex //TODO: Don't modify option |
3536
|
|
|
} ); |
3537
|
|
|
|
3538
|
|
|
this.helper |
3539
|
|
|
.appendTo( "body" ) |
3540
|
|
|
.disableSelection(); |
3541
|
|
|
|
3542
|
|
|
} else { |
3543
|
|
|
this.helper = this.element; |
3544
|
|
|
} |
3545
|
|
|
|
3546
|
|
|
}, |
3547
|
|
|
|
3548
|
|
|
_change: { |
3549
|
|
|
e: function( event, dx ) { |
3550
|
|
|
return { width: this.originalSize.width + dx }; |
3551
|
|
|
}, |
3552
|
|
|
w: function( event, dx ) { |
3553
|
|
|
var cs = this.originalSize, sp = this.originalPosition; |
3554
|
|
|
return { left: sp.left + dx, width: cs.width - dx }; |
3555
|
|
|
}, |
3556
|
|
|
n: function( event, dx, dy ) { |
3557
|
|
|
var cs = this.originalSize, sp = this.originalPosition; |
3558
|
|
|
return { top: sp.top + dy, height: cs.height - dy }; |
3559
|
|
|
}, |
3560
|
|
|
s: function( event, dx, dy ) { |
3561
|
|
|
return { height: this.originalSize.height + dy }; |
3562
|
|
|
}, |
3563
|
|
|
se: function( event, dx, dy ) { |
3564
|
|
|
return $.extend( this._change.s.apply( this, arguments ), |
3565
|
|
|
this._change.e.apply( this, [ event, dx, dy ] ) ); |
3566
|
|
|
}, |
3567
|
|
|
sw: function( event, dx, dy ) { |
3568
|
|
|
return $.extend( this._change.s.apply( this, arguments ), |
3569
|
|
|
this._change.w.apply( this, [ event, dx, dy ] ) ); |
3570
|
|
|
}, |
3571
|
|
|
ne: function( event, dx, dy ) { |
3572
|
|
|
return $.extend( this._change.n.apply( this, arguments ), |
3573
|
|
|
this._change.e.apply( this, [ event, dx, dy ] ) ); |
3574
|
|
|
}, |
3575
|
|
|
nw: function( event, dx, dy ) { |
3576
|
|
|
return $.extend( this._change.n.apply( this, arguments ), |
3577
|
|
|
this._change.w.apply( this, [ event, dx, dy ] ) ); |
3578
|
|
|
} |
3579
|
|
|
}, |
3580
|
|
|
|
3581
|
|
|
_propagate: function( n, event ) { |
3582
|
|
|
$.ui.plugin.call( this, n, [ event, this.ui() ] ); |
3583
|
|
|
( n !== "resize" && this._trigger( n, event, this.ui() ) ); |
3584
|
|
|
}, |
3585
|
|
|
|
3586
|
|
|
plugins: {}, |
3587
|
|
|
|
3588
|
|
|
ui: function() { |
3589
|
|
|
return { |
3590
|
|
|
originalElement: this.originalElement, |
3591
|
|
|
element: this.element, |
3592
|
|
|
helper: this.helper, |
3593
|
|
|
position: this.position, |
3594
|
|
|
size: this.size, |
3595
|
|
|
originalSize: this.originalSize, |
3596
|
|
|
originalPosition: this.originalPosition |
3597
|
|
|
}; |
3598
|
|
|
} |
3599
|
|
|
|
3600
|
|
|
} ); |
3601
|
|
|
|
3602
|
|
|
/* |
3603
|
|
|
* Resizable Extensions |
3604
|
|
|
*/ |
3605
|
|
|
|
3606
|
|
|
$.ui.plugin.add( "resizable", "animate", { |
3607
|
|
|
|
3608
|
|
|
stop: function( event ) { |
3609
|
|
|
var that = $( this ).resizable( "instance" ), |
3610
|
|
|
o = that.options, |
3611
|
|
|
pr = that._proportionallyResizeElements, |
3612
|
|
|
ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ), |
3613
|
|
|
soffseth = ista && that._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height, |
3614
|
|
|
soffsetw = ista ? 0 : that.sizeDiff.width, |
3615
|
|
|
style = { |
3616
|
|
|
width: ( that.size.width - soffsetw ), |
3617
|
|
|
height: ( that.size.height - soffseth ) |
3618
|
|
|
}, |
3619
|
|
|
left = ( parseFloat( that.element.css( "left" ) ) + |
3620
|
|
|
( that.position.left - that.originalPosition.left ) ) || null, |
3621
|
|
|
top = ( parseFloat( that.element.css( "top" ) ) + |
3622
|
|
|
( that.position.top - that.originalPosition.top ) ) || null; |
3623
|
|
|
|
3624
|
|
|
that.element.animate( |
3625
|
|
|
$.extend( style, top && left ? { top: top, left: left } : {} ), { |
3626
|
|
|
duration: o.animateDuration, |
3627
|
|
|
easing: o.animateEasing, |
3628
|
|
|
step: function() { |
3629
|
|
|
|
3630
|
|
|
var data = { |
3631
|
|
|
width: parseFloat( that.element.css( "width" ) ), |
3632
|
|
|
height: parseFloat( that.element.css( "height" ) ), |
3633
|
|
|
top: parseFloat( that.element.css( "top" ) ), |
3634
|
|
|
left: parseFloat( that.element.css( "left" ) ) |
3635
|
|
|
}; |
3636
|
|
|
|
3637
|
|
|
if ( pr && pr.length ) { |
3638
|
|
|
$( pr[ 0 ] ).css( { width: data.width, height: data.height } ); |
3639
|
|
|
} |
3640
|
|
|
|
3641
|
|
|
// Propagating resize, and updating values for each animation step |
3642
|
|
|
that._updateCache( data ); |
3643
|
|
|
that._propagate( "resize", event ); |
3644
|
|
|
|
3645
|
|
|
} |
3646
|
|
|
} |
3647
|
|
|
); |
3648
|
|
|
} |
3649
|
|
|
|
3650
|
|
|
} ); |
3651
|
|
|
|
3652
|
|
|
$.ui.plugin.add( "resizable", "containment", { |
3653
|
|
|
|
3654
|
|
|
start: function() { |
3655
|
|
|
var element, p, co, ch, cw, width, height, |
3656
|
|
|
that = $( this ).resizable( "instance" ), |
3657
|
|
|
o = that.options, |
3658
|
|
|
el = that.element, |
3659
|
|
|
oc = o.containment, |
3660
|
|
|
ce = ( oc instanceof $ ) ? |
3661
|
|
|
oc.get( 0 ) : |
3662
|
|
|
( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc; |
3663
|
|
|
|
3664
|
|
|
if ( !ce ) { |
3665
|
|
|
return; |
3666
|
|
|
} |
3667
|
|
|
|
3668
|
|
|
that.containerElement = $( ce ); |
3669
|
|
|
|
3670
|
|
|
if ( /document/.test( oc ) || oc === document ) { |
3671
|
|
|
that.containerOffset = { |
3672
|
|
|
left: 0, |
3673
|
|
|
top: 0 |
3674
|
|
|
}; |
3675
|
|
|
that.containerPosition = { |
3676
|
|
|
left: 0, |
3677
|
|
|
top: 0 |
3678
|
|
|
}; |
3679
|
|
|
|
3680
|
|
|
that.parentData = { |
3681
|
|
|
element: $( document ), |
3682
|
|
|
left: 0, |
3683
|
|
|
top: 0, |
3684
|
|
|
width: $( document ).width(), |
3685
|
|
|
height: $( document ).height() || document.body.parentNode.scrollHeight |
3686
|
|
|
}; |
3687
|
|
|
} else { |
3688
|
|
|
element = $( ce ); |
3689
|
|
|
p = []; |
3690
|
|
|
$( [ "Top", "Right", "Left", "Bottom" ] ).each( function( i, name ) { |
3691
|
|
|
p[ i ] = that._num( element.css( "padding" + name ) ); |
3692
|
|
|
} ); |
3693
|
|
|
|
3694
|
|
|
that.containerOffset = element.offset(); |
3695
|
|
|
that.containerPosition = element.position(); |
3696
|
|
|
that.containerSize = { |
3697
|
|
|
height: ( element.innerHeight() - p[ 3 ] ), |
3698
|
|
|
width: ( element.innerWidth() - p[ 1 ] ) |
3699
|
|
|
}; |
3700
|
|
|
|
3701
|
|
|
co = that.containerOffset; |
3702
|
|
|
ch = that.containerSize.height; |
3703
|
|
|
cw = that.containerSize.width; |
3704
|
|
|
width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw ); |
3705
|
|
|
height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ; |
3706
|
|
|
|
3707
|
|
|
that.parentData = { |
3708
|
|
|
element: ce, |
3709
|
|
|
left: co.left, |
3710
|
|
|
top: co.top, |
3711
|
|
|
width: width, |
3712
|
|
|
height: height |
3713
|
|
|
}; |
3714
|
|
|
} |
3715
|
|
|
}, |
3716
|
|
|
|
3717
|
|
|
resize: function( event ) { |
3718
|
|
|
var woset, hoset, isParent, isOffsetRelative, |
3719
|
|
|
that = $( this ).resizable( "instance" ), |
3720
|
|
|
o = that.options, |
3721
|
|
|
co = that.containerOffset, |
3722
|
|
|
cp = that.position, |
3723
|
|
|
pRatio = that._aspectRatio || event.shiftKey, |
3724
|
|
|
cop = { |
3725
|
|
|
top: 0, |
3726
|
|
|
left: 0 |
3727
|
|
|
}, |
3728
|
|
|
ce = that.containerElement, |
3729
|
|
|
continueResize = true; |
3730
|
|
|
|
3731
|
|
|
if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) { |
3732
|
|
|
cop = co; |
3733
|
|
|
} |
3734
|
|
|
|
3735
|
|
|
if ( cp.left < ( that._helper ? co.left : 0 ) ) { |
3736
|
|
|
that.size.width = that.size.width + |
3737
|
|
|
( that._helper ? |
3738
|
|
|
( that.position.left - co.left ) : |
3739
|
|
|
( that.position.left - cop.left ) ); |
3740
|
|
|
|
3741
|
|
|
if ( pRatio ) { |
3742
|
|
|
that.size.height = that.size.width / that.aspectRatio; |
3743
|
|
|
continueResize = false; |
3744
|
|
|
} |
3745
|
|
|
that.position.left = o.helper ? co.left : 0; |
3746
|
|
|
} |
3747
|
|
|
|
3748
|
|
|
if ( cp.top < ( that._helper ? co.top : 0 ) ) { |
3749
|
|
|
that.size.height = that.size.height + |
3750
|
|
|
( that._helper ? |
3751
|
|
|
( that.position.top - co.top ) : |
3752
|
|
|
that.position.top ); |
3753
|
|
|
|
3754
|
|
|
if ( pRatio ) { |
3755
|
|
|
that.size.width = that.size.height * that.aspectRatio; |
3756
|
|
|
continueResize = false; |
3757
|
|
|
} |
3758
|
|
|
that.position.top = that._helper ? co.top : 0; |
3759
|
|
|
} |
3760
|
|
|
|
3761
|
|
|
isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 ); |
3762
|
|
|
isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) ); |
3763
|
|
|
|
3764
|
|
|
if ( isParent && isOffsetRelative ) { |
3765
|
|
|
that.offset.left = that.parentData.left + that.position.left; |
3766
|
|
|
that.offset.top = that.parentData.top + that.position.top; |
3767
|
|
|
} else { |
3768
|
|
|
that.offset.left = that.element.offset().left; |
3769
|
|
|
that.offset.top = that.element.offset().top; |
3770
|
|
|
} |
3771
|
|
|
|
3772
|
|
|
woset = Math.abs( that.sizeDiff.width + |
3773
|
|
|
( that._helper ? |
3774
|
|
|
that.offset.left - cop.left : |
3775
|
|
|
( that.offset.left - co.left ) ) ); |
3776
|
|
|
|
3777
|
|
|
hoset = Math.abs( that.sizeDiff.height + |
3778
|
|
|
( that._helper ? |
3779
|
|
|
that.offset.top - cop.top : |
3780
|
|
|
( that.offset.top - co.top ) ) ); |
3781
|
|
|
|
3782
|
|
|
if ( woset + that.size.width >= that.parentData.width ) { |
3783
|
|
|
that.size.width = that.parentData.width - woset; |
3784
|
|
|
if ( pRatio ) { |
3785
|
|
|
that.size.height = that.size.width / that.aspectRatio; |
3786
|
|
|
continueResize = false; |
3787
|
|
|
} |
3788
|
|
|
} |
3789
|
|
|
|
3790
|
|
|
if ( hoset + that.size.height >= that.parentData.height ) { |
3791
|
|
|
that.size.height = that.parentData.height - hoset; |
3792
|
|
|
if ( pRatio ) { |
3793
|
|
|
that.size.width = that.size.height * that.aspectRatio; |
3794
|
|
|
continueResize = false; |
3795
|
|
|
} |
3796
|
|
|
} |
3797
|
|
|
|
3798
|
|
|
if ( !continueResize ) { |
3799
|
|
|
that.position.left = that.prevPosition.left; |
3800
|
|
|
that.position.top = that.prevPosition.top; |
3801
|
|
|
that.size.width = that.prevSize.width; |
3802
|
|
|
that.size.height = that.prevSize.height; |
3803
|
|
|
} |
3804
|
|
|
}, |
3805
|
|
|
|
3806
|
|
|
stop: function() { |
3807
|
|
|
var that = $( this ).resizable( "instance" ), |
3808
|
|
|
o = that.options, |
3809
|
|
|
co = that.containerOffset, |
3810
|
|
|
cop = that.containerPosition, |
3811
|
|
|
ce = that.containerElement, |
3812
|
|
|
helper = $( that.helper ), |
3813
|
|
|
ho = helper.offset(), |
3814
|
|
|
w = helper.outerWidth() - that.sizeDiff.width, |
3815
|
|
|
h = helper.outerHeight() - that.sizeDiff.height; |
3816
|
|
|
|
3817
|
|
|
if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) { |
3818
|
|
|
$( this ).css( { |
3819
|
|
|
left: ho.left - cop.left - co.left, |
3820
|
|
|
width: w, |
3821
|
|
|
height: h |
3822
|
|
|
} ); |
3823
|
|
|
} |
3824
|
|
|
|
3825
|
|
|
if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) { |
3826
|
|
|
$( this ).css( { |
3827
|
|
|
left: ho.left - cop.left - co.left, |
3828
|
|
|
width: w, |
3829
|
|
|
height: h |
3830
|
|
|
} ); |
3831
|
|
|
} |
3832
|
|
|
} |
3833
|
|
|
} ); |
3834
|
|
|
|
3835
|
|
|
$.ui.plugin.add( "resizable", "alsoResize", { |
3836
|
|
|
|
3837
|
|
|
start: function() { |
3838
|
|
|
var that = $( this ).resizable( "instance" ), |
3839
|
|
|
o = that.options; |
3840
|
|
|
|
3841
|
|
|
$( o.alsoResize ).each( function() { |
3842
|
|
|
var el = $( this ); |
3843
|
|
|
el.data( "ui-resizable-alsoresize", { |
3844
|
|
|
width: parseFloat( el.width() ), height: parseFloat( el.height() ), |
3845
|
|
|
left: parseFloat( el.css( "left" ) ), top: parseFloat( el.css( "top" ) ) |
3846
|
|
|
} ); |
3847
|
|
|
} ); |
3848
|
|
|
}, |
3849
|
|
|
|
3850
|
|
|
resize: function( event, ui ) { |
3851
|
|
|
var that = $( this ).resizable( "instance" ), |
3852
|
|
|
o = that.options, |
3853
|
|
|
os = that.originalSize, |
3854
|
|
|
op = that.originalPosition, |
3855
|
|
|
delta = { |
3856
|
|
|
height: ( that.size.height - os.height ) || 0, |
3857
|
|
|
width: ( that.size.width - os.width ) || 0, |
3858
|
|
|
top: ( that.position.top - op.top ) || 0, |
3859
|
|
|
left: ( that.position.left - op.left ) || 0 |
3860
|
|
|
}; |
3861
|
|
|
|
3862
|
|
|
$( o.alsoResize ).each( function() { |
3863
|
|
|
var el = $( this ), start = $( this ).data( "ui-resizable-alsoresize" ), style = {}, |
3864
|
|
|
css = el.parents( ui.originalElement[ 0 ] ).length ? |
3865
|
|
|
[ "width", "height" ] : |
3866
|
|
|
[ "width", "height", "top", "left" ]; |
3867
|
|
|
|
3868
|
|
|
$.each( css, function( i, prop ) { |
3869
|
|
|
var sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 ); |
3870
|
|
|
if ( sum && sum >= 0 ) { |
3871
|
|
|
style[ prop ] = sum || null; |
3872
|
|
|
} |
3873
|
|
|
} ); |
3874
|
|
|
|
3875
|
|
|
el.css( style ); |
3876
|
|
|
} ); |
3877
|
|
|
}, |
3878
|
|
|
|
3879
|
|
|
stop: function() { |
3880
|
|
|
$( this ).removeData( "ui-resizable-alsoresize" ); |
3881
|
|
|
} |
3882
|
|
|
} ); |
3883
|
|
|
|
3884
|
|
|
$.ui.plugin.add( "resizable", "ghost", { |
3885
|
|
|
|
3886
|
|
|
start: function() { |
3887
|
|
|
|
3888
|
|
|
var that = $( this ).resizable( "instance" ), cs = that.size; |
3889
|
|
|
|
3890
|
|
|
that.ghost = that.originalElement.clone(); |
3891
|
|
|
that.ghost.css( { |
3892
|
|
|
opacity: 0.25, |
3893
|
|
|
display: "block", |
3894
|
|
|
position: "relative", |
3895
|
|
|
height: cs.height, |
3896
|
|
|
width: cs.width, |
3897
|
|
|
margin: 0, |
3898
|
|
|
left: 0, |
3899
|
|
|
top: 0 |
3900
|
|
|
} ); |
3901
|
|
|
|
3902
|
|
|
that._addClass( that.ghost, "ui-resizable-ghost" ); |
3903
|
|
|
|
3904
|
|
|
// DEPRECATED |
3905
|
|
|
// TODO: remove after 1.12 |
3906
|
|
|
if ( $.uiBackCompat !== false && typeof that.options.ghost === "string" ) { |
3907
|
|
|
|
3908
|
|
|
// Ghost option |
3909
|
|
|
that.ghost.addClass( this.options.ghost ); |
3910
|
|
|
} |
3911
|
|
|
|
3912
|
|
|
that.ghost.appendTo( that.helper ); |
3913
|
|
|
|
3914
|
|
|
}, |
3915
|
|
|
|
3916
|
|
|
resize: function() { |
3917
|
|
|
var that = $( this ).resizable( "instance" ); |
3918
|
|
|
if ( that.ghost ) { |
3919
|
|
|
that.ghost.css( { |
3920
|
|
|
position: "relative", |
3921
|
|
|
height: that.size.height, |
3922
|
|
|
width: that.size.width |
3923
|
|
|
} ); |
3924
|
|
|
} |
3925
|
|
|
}, |
3926
|
|
|
|
3927
|
|
|
stop: function() { |
3928
|
|
|
var that = $( this ).resizable( "instance" ); |
3929
|
|
|
if ( that.ghost && that.helper ) { |
3930
|
|
|
that.helper.get( 0 ).removeChild( that.ghost.get( 0 ) ); |
3931
|
|
|
} |
3932
|
|
|
} |
3933
|
|
|
|
3934
|
|
|
} ); |
3935
|
|
|
|
3936
|
|
|
$.ui.plugin.add( "resizable", "grid", { |
3937
|
|
|
|
3938
|
|
|
resize: function() { |
3939
|
|
|
var outerDimensions, |
3940
|
|
|
that = $( this ).resizable( "instance" ), |
3941
|
|
|
o = that.options, |
3942
|
|
|
cs = that.size, |
3943
|
|
|
os = that.originalSize, |
3944
|
|
|
op = that.originalPosition, |
3945
|
|
|
a = that.axis, |
3946
|
|
|
grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid, |
3947
|
|
|
gridX = ( grid[ 0 ] || 1 ), |
3948
|
|
|
gridY = ( grid[ 1 ] || 1 ), |
3949
|
|
|
ox = Math.round( ( cs.width - os.width ) / gridX ) * gridX, |
3950
|
|
|
oy = Math.round( ( cs.height - os.height ) / gridY ) * gridY, |
3951
|
|
|
newWidth = os.width + ox, |
3952
|
|
|
newHeight = os.height + oy, |
3953
|
|
|
isMaxWidth = o.maxWidth && ( o.maxWidth < newWidth ), |
3954
|
|
|
isMaxHeight = o.maxHeight && ( o.maxHeight < newHeight ), |
3955
|
|
|
isMinWidth = o.minWidth && ( o.minWidth > newWidth ), |
3956
|
|
|
isMinHeight = o.minHeight && ( o.minHeight > newHeight ); |
3957
|
|
|
|
3958
|
|
|
o.grid = grid; |
3959
|
|
|
|
3960
|
|
|
if ( isMinWidth ) { |
3961
|
|
|
newWidth += gridX; |
3962
|
|
|
} |
3963
|
|
|
if ( isMinHeight ) { |
3964
|
|
|
newHeight += gridY; |
3965
|
|
|
} |
3966
|
|
|
if ( isMaxWidth ) { |
3967
|
|
|
newWidth -= gridX; |
3968
|
|
|
} |
3969
|
|
|
if ( isMaxHeight ) { |
3970
|
|
|
newHeight -= gridY; |
3971
|
|
|
} |
3972
|
|
|
|
3973
|
|
|
if ( /^(se|s|e)$/.test( a ) ) { |
3974
|
|
|
that.size.width = newWidth; |
3975
|
|
|
that.size.height = newHeight; |
3976
|
|
|
} else if ( /^(ne)$/.test( a ) ) { |
3977
|
|
|
that.size.width = newWidth; |
3978
|
|
|
that.size.height = newHeight; |
3979
|
|
|
that.position.top = op.top - oy; |
3980
|
|
|
} else if ( /^(sw)$/.test( a ) ) { |
3981
|
|
|
that.size.width = newWidth; |
3982
|
|
|
that.size.height = newHeight; |
3983
|
|
|
that.position.left = op.left - ox; |
3984
|
|
|
} else { |
3985
|
|
|
if ( newHeight - gridY <= 0 || newWidth - gridX <= 0 ) { |
3986
|
|
|
outerDimensions = that._getPaddingPlusBorderDimensions( this ); |
3987
|
|
|
} |
3988
|
|
|
|
3989
|
|
|
if ( newHeight - gridY > 0 ) { |
3990
|
|
|
that.size.height = newHeight; |
3991
|
|
|
that.position.top = op.top - oy; |
3992
|
|
|
} else { |
3993
|
|
|
newHeight = gridY - outerDimensions.height; |
|
|
|
|
3994
|
|
|
that.size.height = newHeight; |
3995
|
|
|
that.position.top = op.top + os.height - newHeight; |
3996
|
|
|
} |
3997
|
|
|
if ( newWidth - gridX > 0 ) { |
3998
|
|
|
that.size.width = newWidth; |
3999
|
|
|
that.position.left = op.left - ox; |
4000
|
|
|
} else { |
4001
|
|
|
newWidth = gridX - outerDimensions.width; |
4002
|
|
|
that.size.width = newWidth; |
4003
|
|
|
that.position.left = op.left + os.width - newWidth; |
4004
|
|
|
} |
4005
|
|
|
} |
4006
|
|
|
} |
4007
|
|
|
|
4008
|
|
|
} ); |
4009
|
|
|
|
4010
|
|
|
var widgetsResizable = $.ui.resizable; |
|
|
|
|
4011
|
|
|
|
4012
|
|
|
|
4013
|
|
|
/*! |
4014
|
|
|
* jQuery UI Selectable 1.12.0 |
4015
|
|
|
* http://jqueryui.com |
4016
|
|
|
* |
4017
|
|
|
* Copyright jQuery Foundation and other contributors |
4018
|
|
|
* Released under the MIT license. |
4019
|
|
|
* http://jquery.org/license |
4020
|
|
|
*/ |
4021
|
|
|
|
4022
|
|
|
//>>label: Selectable |
4023
|
|
|
//>>group: Interactions |
4024
|
|
|
//>>description: Allows groups of elements to be selected with the mouse. |
4025
|
|
|
//>>docs: http://api.jqueryui.com/selectable/ |
4026
|
|
|
//>>demos: http://jqueryui.com/selectable/ |
4027
|
|
|
//>>css.structure: ../../themes/base/selectable.css |
4028
|
|
|
|
4029
|
|
|
|
4030
|
|
|
|
4031
|
|
|
var widgetsSelectable = $.widget( "ui.selectable", $.ui.mouse, { |
|
|
|
|
4032
|
|
|
version: "1.12.0", |
4033
|
|
|
options: { |
4034
|
|
|
appendTo: "body", |
4035
|
|
|
autoRefresh: true, |
4036
|
|
|
distance: 0, |
4037
|
|
|
filter: "*", |
4038
|
|
|
tolerance: "touch", |
4039
|
|
|
|
4040
|
|
|
// Callbacks |
4041
|
|
|
selected: null, |
4042
|
|
|
selecting: null, |
4043
|
|
|
start: null, |
4044
|
|
|
stop: null, |
4045
|
|
|
unselected: null, |
4046
|
|
|
unselecting: null |
4047
|
|
|
}, |
4048
|
|
|
_create: function() { |
4049
|
|
|
var that = this; |
4050
|
|
|
|
4051
|
|
|
this._addClass( "ui-selectable" ); |
4052
|
|
|
|
4053
|
|
|
this.dragged = false; |
4054
|
|
|
|
4055
|
|
|
// Cache selectee children based on filter |
4056
|
|
|
this.refresh = function() { |
4057
|
|
|
that.elementPos = $( that.element[ 0 ] ).offset(); |
4058
|
|
|
that.selectees = $( that.options.filter, that.element[ 0 ] ); |
4059
|
|
|
that._addClass( that.selectees, "ui-selectee" ); |
4060
|
|
|
that.selectees.each( function() { |
4061
|
|
|
var $this = $( this ), |
4062
|
|
|
selecteeOffset = $this.offset(), |
4063
|
|
|
pos = { |
4064
|
|
|
left: selecteeOffset.left - that.elementPos.left, |
4065
|
|
|
top: selecteeOffset.top - that.elementPos.top |
4066
|
|
|
}; |
4067
|
|
|
$.data( this, "selectable-item", { |
4068
|
|
|
element: this, |
4069
|
|
|
$element: $this, |
4070
|
|
|
left: pos.left, |
4071
|
|
|
top: pos.top, |
4072
|
|
|
right: pos.left + $this.outerWidth(), |
4073
|
|
|
bottom: pos.top + $this.outerHeight(), |
4074
|
|
|
startselected: false, |
4075
|
|
|
selected: $this.hasClass( "ui-selected" ), |
4076
|
|
|
selecting: $this.hasClass( "ui-selecting" ), |
4077
|
|
|
unselecting: $this.hasClass( "ui-unselecting" ) |
4078
|
|
|
} ); |
4079
|
|
|
} ); |
4080
|
|
|
}; |
4081
|
|
|
this.refresh(); |
4082
|
|
|
|
4083
|
|
|
this._mouseInit(); |
4084
|
|
|
|
4085
|
|
|
this.helper = $( "<div>" ); |
4086
|
|
|
this._addClass( this.helper, "ui-selectable-helper" ); |
4087
|
|
|
}, |
4088
|
|
|
|
4089
|
|
|
_destroy: function() { |
4090
|
|
|
this.selectees.removeData( "selectable-item" ); |
4091
|
|
|
this._mouseDestroy(); |
4092
|
|
|
}, |
4093
|
|
|
|
4094
|
|
|
_mouseStart: function( event ) { |
4095
|
|
|
var that = this, |
4096
|
|
|
options = this.options; |
4097
|
|
|
|
4098
|
|
|
this.opos = [ event.pageX, event.pageY ]; |
4099
|
|
|
this.elementPos = $( this.element[ 0 ] ).offset(); |
4100
|
|
|
|
4101
|
|
|
if ( this.options.disabled ) { |
4102
|
|
|
return; |
4103
|
|
|
} |
4104
|
|
|
|
4105
|
|
|
this.selectees = $( options.filter, this.element[ 0 ] ); |
4106
|
|
|
|
4107
|
|
|
this._trigger( "start", event ); |
4108
|
|
|
|
4109
|
|
|
$( options.appendTo ).append( this.helper ); |
4110
|
|
|
|
4111
|
|
|
// position helper (lasso) |
4112
|
|
|
this.helper.css( { |
4113
|
|
|
"left": event.pageX, |
4114
|
|
|
"top": event.pageY, |
4115
|
|
|
"width": 0, |
4116
|
|
|
"height": 0 |
4117
|
|
|
} ); |
4118
|
|
|
|
4119
|
|
|
if ( options.autoRefresh ) { |
4120
|
|
|
this.refresh(); |
4121
|
|
|
} |
4122
|
|
|
|
4123
|
|
|
this.selectees.filter( ".ui-selected" ).each( function() { |
4124
|
|
|
var selectee = $.data( this, "selectable-item" ); |
4125
|
|
|
selectee.startselected = true; |
4126
|
|
|
if ( !event.metaKey && !event.ctrlKey ) { |
4127
|
|
|
that._removeClass( selectee.$element, "ui-selected" ); |
4128
|
|
|
selectee.selected = false; |
4129
|
|
|
that._addClass( selectee.$element, "ui-unselecting" ); |
4130
|
|
|
selectee.unselecting = true; |
4131
|
|
|
|
4132
|
|
|
// selectable UNSELECTING callback |
4133
|
|
|
that._trigger( "unselecting", event, { |
4134
|
|
|
unselecting: selectee.element |
4135
|
|
|
} ); |
4136
|
|
|
} |
4137
|
|
|
} ); |
4138
|
|
|
|
4139
|
|
|
$( event.target ).parents().addBack().each( function() { |
4140
|
|
|
var doSelect, |
4141
|
|
|
selectee = $.data( this, "selectable-item" ); |
4142
|
|
|
if ( selectee ) { |
|
|
|
|
4143
|
|
|
doSelect = ( !event.metaKey && !event.ctrlKey ) || |
4144
|
|
|
!selectee.$element.hasClass( "ui-selected" ); |
4145
|
|
|
that._removeClass( selectee.$element, doSelect ? "ui-unselecting" : "ui-selected" ) |
4146
|
|
|
._addClass( selectee.$element, doSelect ? "ui-selecting" : "ui-unselecting" ); |
4147
|
|
|
selectee.unselecting = !doSelect; |
4148
|
|
|
selectee.selecting = doSelect; |
4149
|
|
|
selectee.selected = doSelect; |
4150
|
|
|
|
4151
|
|
|
// selectable (UN)SELECTING callback |
4152
|
|
|
if ( doSelect ) { |
4153
|
|
|
that._trigger( "selecting", event, { |
4154
|
|
|
selecting: selectee.element |
4155
|
|
|
} ); |
4156
|
|
|
} else { |
4157
|
|
|
that._trigger( "unselecting", event, { |
4158
|
|
|
unselecting: selectee.element |
4159
|
|
|
} ); |
4160
|
|
|
} |
4161
|
|
|
return false; |
4162
|
|
|
} |
4163
|
|
|
} ); |
4164
|
|
|
|
4165
|
|
|
}, |
4166
|
|
|
|
4167
|
|
|
_mouseDrag: function( event ) { |
4168
|
|
|
|
4169
|
|
|
this.dragged = true; |
4170
|
|
|
|
4171
|
|
|
if ( this.options.disabled ) { |
4172
|
|
|
return; |
|
|
|
|
4173
|
|
|
} |
4174
|
|
|
|
4175
|
|
|
var tmp, |
4176
|
|
|
that = this, |
4177
|
|
|
options = this.options, |
4178
|
|
|
x1 = this.opos[ 0 ], |
4179
|
|
|
y1 = this.opos[ 1 ], |
4180
|
|
|
x2 = event.pageX, |
4181
|
|
|
y2 = event.pageY; |
4182
|
|
|
|
4183
|
|
|
if ( x1 > x2 ) { tmp = x2; x2 = x1; x1 = tmp; } |
4184
|
|
|
if ( y1 > y2 ) { tmp = y2; y2 = y1; y1 = tmp; } |
4185
|
|
|
this.helper.css( { left: x1, top: y1, width: x2 - x1, height: y2 - y1 } ); |
4186
|
|
|
|
4187
|
|
|
this.selectees.each( function() { |
4188
|
|
|
var selectee = $.data( this, "selectable-item" ), |
4189
|
|
|
hit = false, |
4190
|
|
|
offset = {}; |
4191
|
|
|
|
4192
|
|
|
//prevent helper from being selected if appendTo: selectable |
4193
|
|
|
if ( !selectee || selectee.element === that.element[ 0 ] ) { |
4194
|
|
|
return; |
4195
|
|
|
} |
4196
|
|
|
|
4197
|
|
|
offset.left = selectee.left + that.elementPos.left; |
4198
|
|
|
offset.right = selectee.right + that.elementPos.left; |
4199
|
|
|
offset.top = selectee.top + that.elementPos.top; |
4200
|
|
|
offset.bottom = selectee.bottom + that.elementPos.top; |
4201
|
|
|
|
4202
|
|
|
if ( options.tolerance === "touch" ) { |
4203
|
|
|
hit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 || |
4204
|
|
|
offset.bottom < y1 ) ); |
4205
|
|
|
} else if ( options.tolerance === "fit" ) { |
4206
|
|
|
hit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 && |
4207
|
|
|
offset.bottom < y2 ); |
4208
|
|
|
} |
4209
|
|
|
|
4210
|
|
|
if ( hit ) { |
4211
|
|
|
|
4212
|
|
|
// SELECT |
4213
|
|
|
if ( selectee.selected ) { |
4214
|
|
|
that._removeClass( selectee.$element, "ui-selected" ); |
4215
|
|
|
selectee.selected = false; |
4216
|
|
|
} |
4217
|
|
|
if ( selectee.unselecting ) { |
4218
|
|
|
that._removeClass( selectee.$element, "ui-unselecting" ); |
4219
|
|
|
selectee.unselecting = false; |
4220
|
|
|
} |
4221
|
|
|
if ( !selectee.selecting ) { |
4222
|
|
|
that._addClass( selectee.$element, "ui-selecting" ); |
4223
|
|
|
selectee.selecting = true; |
4224
|
|
|
|
4225
|
|
|
// selectable SELECTING callback |
4226
|
|
|
that._trigger( "selecting", event, { |
4227
|
|
|
selecting: selectee.element |
4228
|
|
|
} ); |
4229
|
|
|
} |
4230
|
|
|
} else { |
4231
|
|
|
|
4232
|
|
|
// UNSELECT |
4233
|
|
|
if ( selectee.selecting ) { |
4234
|
|
|
if ( ( event.metaKey || event.ctrlKey ) && selectee.startselected ) { |
4235
|
|
|
that._removeClass( selectee.$element, "ui-selecting" ); |
4236
|
|
|
selectee.selecting = false; |
4237
|
|
|
that._addClass( selectee.$element, "ui-selected" ); |
4238
|
|
|
selectee.selected = true; |
4239
|
|
|
} else { |
4240
|
|
|
that._removeClass( selectee.$element, "ui-selecting" ); |
4241
|
|
|
selectee.selecting = false; |
4242
|
|
|
if ( selectee.startselected ) { |
4243
|
|
|
that._addClass( selectee.$element, "ui-unselecting" ); |
4244
|
|
|
selectee.unselecting = true; |
4245
|
|
|
} |
4246
|
|
|
|
4247
|
|
|
// selectable UNSELECTING callback |
4248
|
|
|
that._trigger( "unselecting", event, { |
4249
|
|
|
unselecting: selectee.element |
4250
|
|
|
} ); |
4251
|
|
|
} |
4252
|
|
|
} |
4253
|
|
|
if ( selectee.selected ) { |
4254
|
|
|
if ( !event.metaKey && !event.ctrlKey && !selectee.startselected ) { |
4255
|
|
|
that._removeClass( selectee.$element, "ui-selected" ); |
4256
|
|
|
selectee.selected = false; |
4257
|
|
|
|
4258
|
|
|
that._addClass( selectee.$element, "ui-unselecting" ); |
4259
|
|
|
selectee.unselecting = true; |
4260
|
|
|
|
4261
|
|
|
// selectable UNSELECTING callback |
4262
|
|
|
that._trigger( "unselecting", event, { |
4263
|
|
|
unselecting: selectee.element |
4264
|
|
|
} ); |
4265
|
|
|
} |
4266
|
|
|
} |
4267
|
|
|
} |
4268
|
|
|
} ); |
4269
|
|
|
|
4270
|
|
|
return false; |
4271
|
|
|
}, |
4272
|
|
|
|
4273
|
|
|
_mouseStop: function( event ) { |
4274
|
|
|
var that = this; |
4275
|
|
|
|
4276
|
|
|
this.dragged = false; |
4277
|
|
|
|
4278
|
|
|
$( ".ui-unselecting", this.element[ 0 ] ).each( function() { |
4279
|
|
|
var selectee = $.data( this, "selectable-item" ); |
4280
|
|
|
that._removeClass( selectee.$element, "ui-unselecting" ); |
4281
|
|
|
selectee.unselecting = false; |
4282
|
|
|
selectee.startselected = false; |
4283
|
|
|
that._trigger( "unselected", event, { |
4284
|
|
|
unselected: selectee.element |
4285
|
|
|
} ); |
4286
|
|
|
} ); |
4287
|
|
|
$( ".ui-selecting", this.element[ 0 ] ).each( function() { |
4288
|
|
|
var selectee = $.data( this, "selectable-item" ); |
4289
|
|
|
that._removeClass( selectee.$element, "ui-selecting" ) |
4290
|
|
|
._addClass( selectee.$element, "ui-selected" ); |
4291
|
|
|
selectee.selecting = false; |
4292
|
|
|
selectee.selected = true; |
4293
|
|
|
selectee.startselected = true; |
4294
|
|
|
that._trigger( "selected", event, { |
4295
|
|
|
selected: selectee.element |
4296
|
|
|
} ); |
4297
|
|
|
} ); |
4298
|
|
|
this._trigger( "stop", event ); |
4299
|
|
|
|
4300
|
|
|
this.helper.remove(); |
4301
|
|
|
|
4302
|
|
|
return false; |
4303
|
|
|
} |
4304
|
|
|
|
4305
|
|
|
} ); |
4306
|
|
|
|
4307
|
|
|
|
4308
|
|
|
/*! |
4309
|
|
|
* jQuery UI Sortable 1.12.0 |
4310
|
|
|
* http://jqueryui.com |
4311
|
|
|
* |
4312
|
|
|
* Copyright jQuery Foundation and other contributors |
4313
|
|
|
* Released under the MIT license. |
4314
|
|
|
* http://jquery.org/license |
4315
|
|
|
*/ |
4316
|
|
|
|
4317
|
|
|
//>>label: Sortable |
4318
|
|
|
//>>group: Interactions |
4319
|
|
|
//>>description: Enables items in a list to be sorted using the mouse. |
4320
|
|
|
//>>docs: http://api.jqueryui.com/sortable/ |
4321
|
|
|
//>>demos: http://jqueryui.com/sortable/ |
4322
|
|
|
//>>css.structure: ../../themes/base/sortable.css |
4323
|
|
|
|
4324
|
|
|
|
4325
|
|
|
|
4326
|
|
|
var widgetsSortable = $.widget( "ui.sortable", $.ui.mouse, { |
|
|
|
|
4327
|
|
|
version: "1.12.0", |
4328
|
|
|
widgetEventPrefix: "sort", |
4329
|
|
|
ready: false, |
4330
|
|
|
options: { |
4331
|
|
|
appendTo: "parent", |
4332
|
|
|
axis: false, |
4333
|
|
|
connectWith: false, |
4334
|
|
|
containment: false, |
4335
|
|
|
cursor: "auto", |
4336
|
|
|
cursorAt: false, |
4337
|
|
|
dropOnEmpty: true, |
4338
|
|
|
forcePlaceholderSize: false, |
4339
|
|
|
forceHelperSize: false, |
4340
|
|
|
grid: false, |
4341
|
|
|
handle: false, |
4342
|
|
|
helper: "original", |
4343
|
|
|
items: "> *", |
4344
|
|
|
opacity: false, |
4345
|
|
|
placeholder: false, |
4346
|
|
|
revert: false, |
4347
|
|
|
scroll: true, |
4348
|
|
|
scrollSensitivity: 20, |
4349
|
|
|
scrollSpeed: 20, |
4350
|
|
|
scope: "default", |
4351
|
|
|
tolerance: "intersect", |
4352
|
|
|
zIndex: 1000, |
4353
|
|
|
|
4354
|
|
|
// Callbacks |
4355
|
|
|
activate: null, |
4356
|
|
|
beforeStop: null, |
4357
|
|
|
change: null, |
4358
|
|
|
deactivate: null, |
4359
|
|
|
out: null, |
4360
|
|
|
over: null, |
4361
|
|
|
receive: null, |
4362
|
|
|
remove: null, |
4363
|
|
|
sort: null, |
4364
|
|
|
start: null, |
4365
|
|
|
stop: null, |
4366
|
|
|
update: null |
4367
|
|
|
}, |
4368
|
|
|
|
4369
|
|
|
_isOverAxis: function( x, reference, size ) { |
4370
|
|
|
return ( x >= reference ) && ( x < ( reference + size ) ); |
4371
|
|
|
}, |
4372
|
|
|
|
4373
|
|
|
_isFloating: function( item ) { |
4374
|
|
|
return ( /left|right/ ).test( item.css( "float" ) ) || |
4375
|
|
|
( /inline|table-cell/ ).test( item.css( "display" ) ); |
4376
|
|
|
}, |
4377
|
|
|
|
4378
|
|
|
_create: function() { |
4379
|
|
|
this.containerCache = {}; |
4380
|
|
|
this._addClass( "ui-sortable" ); |
4381
|
|
|
|
4382
|
|
|
//Get the items |
4383
|
|
|
this.refresh(); |
4384
|
|
|
|
4385
|
|
|
//Let's determine the parent's offset |
4386
|
|
|
this.offset = this.element.offset(); |
4387
|
|
|
|
4388
|
|
|
//Initialize mouse events for interaction |
4389
|
|
|
this._mouseInit(); |
4390
|
|
|
|
4391
|
|
|
this._setHandleClassName(); |
4392
|
|
|
|
4393
|
|
|
//We're ready to go |
4394
|
|
|
this.ready = true; |
4395
|
|
|
|
4396
|
|
|
}, |
4397
|
|
|
|
4398
|
|
|
_setOption: function( key, value ) { |
4399
|
|
|
this._super( key, value ); |
4400
|
|
|
|
4401
|
|
|
if ( key === "handle" ) { |
4402
|
|
|
this._setHandleClassName(); |
4403
|
|
|
} |
4404
|
|
|
}, |
4405
|
|
|
|
4406
|
|
|
_setHandleClassName: function() { |
4407
|
|
|
var that = this; |
4408
|
|
|
this._removeClass( this.element.find( ".ui-sortable-handle" ), "ui-sortable-handle" ); |
4409
|
|
|
$.each( this.items, function() { |
4410
|
|
|
that._addClass( |
4411
|
|
|
this.instance.options.handle ? |
4412
|
|
|
this.item.find( this.instance.options.handle ) : |
4413
|
|
|
this.item, |
4414
|
|
|
"ui-sortable-handle" |
4415
|
|
|
); |
4416
|
|
|
} ); |
4417
|
|
|
}, |
4418
|
|
|
|
4419
|
|
|
_destroy: function() { |
4420
|
|
|
this._mouseDestroy(); |
4421
|
|
|
|
4422
|
|
|
for ( var i = this.items.length - 1; i >= 0; i-- ) { |
4423
|
|
|
this.items[ i ].item.removeData( this.widgetName + "-item" ); |
4424
|
|
|
} |
4425
|
|
|
|
4426
|
|
|
return this; |
4427
|
|
|
}, |
4428
|
|
|
|
4429
|
|
|
_mouseCapture: function( event, overrideHandle ) { |
4430
|
|
|
var currentItem = null, |
4431
|
|
|
validHandle = false, |
4432
|
|
|
that = this; |
4433
|
|
|
|
4434
|
|
|
if ( this.reverting ) { |
4435
|
|
|
return false; |
4436
|
|
|
} |
4437
|
|
|
|
4438
|
|
|
if ( this.options.disabled || this.options.type === "static" ) { |
4439
|
|
|
return false; |
4440
|
|
|
} |
4441
|
|
|
|
4442
|
|
|
//We have to refresh the items data once first |
4443
|
|
|
this._refreshItems( event ); |
4444
|
|
|
|
4445
|
|
|
//Find out if the clicked node (or one of its parents) is a actual item in this.items |
4446
|
|
|
$( event.target ).parents().each( function() { |
4447
|
|
|
if ( $.data( this, that.widgetName + "-item" ) === that ) { |
|
|
|
|
4448
|
|
|
currentItem = $( this ); |
4449
|
|
|
return false; |
4450
|
|
|
} |
4451
|
|
|
} ); |
4452
|
|
|
if ( $.data( event.target, that.widgetName + "-item" ) === that ) { |
4453
|
|
|
currentItem = $( event.target ); |
4454
|
|
|
} |
4455
|
|
|
|
4456
|
|
|
if ( !currentItem ) { |
4457
|
|
|
return false; |
4458
|
|
|
} |
4459
|
|
|
if ( this.options.handle && !overrideHandle ) { |
4460
|
|
|
$( this.options.handle, currentItem ).find( "*" ).addBack().each( function() { |
4461
|
|
|
if ( this === event.target ) { |
4462
|
|
|
validHandle = true; |
4463
|
|
|
} |
4464
|
|
|
} ); |
4465
|
|
|
if ( !validHandle ) { |
4466
|
|
|
return false; |
4467
|
|
|
} |
4468
|
|
|
} |
4469
|
|
|
|
4470
|
|
|
this.currentItem = currentItem; |
4471
|
|
|
this._removeCurrentsFromItems(); |
4472
|
|
|
return true; |
4473
|
|
|
|
4474
|
|
|
}, |
4475
|
|
|
|
4476
|
|
|
_mouseStart: function( event, overrideHandle, noActivation ) { |
4477
|
|
|
|
4478
|
|
|
var i, body, |
4479
|
|
|
o = this.options; |
4480
|
|
|
|
4481
|
|
|
this.currentContainer = this; |
4482
|
|
|
|
4483
|
|
|
//We only need to call refreshPositions, because the refreshItems call has been moved to |
4484
|
|
|
// mouseCapture |
4485
|
|
|
this.refreshPositions(); |
4486
|
|
|
|
4487
|
|
|
//Create and append the visible helper |
4488
|
|
|
this.helper = this._createHelper( event ); |
4489
|
|
|
|
4490
|
|
|
//Cache the helper size |
4491
|
|
|
this._cacheHelperProportions(); |
4492
|
|
|
|
4493
|
|
|
/* |
4494
|
|
|
* - Position generation - |
4495
|
|
|
* This block generates everything position related - it's the core of draggables. |
4496
|
|
|
*/ |
4497
|
|
|
|
4498
|
|
|
//Cache the margins of the original element |
4499
|
|
|
this._cacheMargins(); |
4500
|
|
|
|
4501
|
|
|
//Get the next scrolling parent |
4502
|
|
|
this.scrollParent = this.helper.scrollParent(); |
4503
|
|
|
|
4504
|
|
|
//The element's absolute position on the page minus margins |
4505
|
|
|
this.offset = this.currentItem.offset(); |
4506
|
|
|
this.offset = { |
4507
|
|
|
top: this.offset.top - this.margins.top, |
4508
|
|
|
left: this.offset.left - this.margins.left |
4509
|
|
|
}; |
4510
|
|
|
|
4511
|
|
|
$.extend( this.offset, { |
4512
|
|
|
click: { //Where the click happened, relative to the element |
4513
|
|
|
left: event.pageX - this.offset.left, |
4514
|
|
|
top: event.pageY - this.offset.top |
4515
|
|
|
}, |
4516
|
|
|
parent: this._getParentOffset(), |
4517
|
|
|
|
4518
|
|
|
// This is a relative to absolute position minus the actual position calculation - |
4519
|
|
|
// only used for relative positioned helper |
4520
|
|
|
relative: this._getRelativeOffset() |
4521
|
|
|
} ); |
4522
|
|
|
|
4523
|
|
|
// Only after we got the offset, we can change the helper's position to absolute |
4524
|
|
|
// TODO: Still need to figure out a way to make relative sorting possible |
4525
|
|
|
this.helper.css( "position", "absolute" ); |
4526
|
|
|
this.cssPosition = this.helper.css( "position" ); |
4527
|
|
|
|
4528
|
|
|
//Generate the original position |
4529
|
|
|
this.originalPosition = this._generatePosition( event ); |
4530
|
|
|
this.originalPageX = event.pageX; |
4531
|
|
|
this.originalPageY = event.pageY; |
4532
|
|
|
|
4533
|
|
|
//Adjust the mouse offset relative to the helper if "cursorAt" is supplied |
4534
|
|
|
( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) ); |
4535
|
|
|
|
4536
|
|
|
//Cache the former DOM position |
4537
|
|
|
this.domPosition = { |
4538
|
|
|
prev: this.currentItem.prev()[ 0 ], |
4539
|
|
|
parent: this.currentItem.parent()[ 0 ] |
4540
|
|
|
}; |
4541
|
|
|
|
4542
|
|
|
// If the helper is not the original, hide the original so it's not playing any role during |
4543
|
|
|
// the drag, won't cause anything bad this way |
4544
|
|
|
if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) { |
4545
|
|
|
this.currentItem.hide(); |
4546
|
|
|
} |
4547
|
|
|
|
4548
|
|
|
//Create the placeholder |
4549
|
|
|
this._createPlaceholder(); |
4550
|
|
|
|
4551
|
|
|
//Set a containment if given in the options |
4552
|
|
|
if ( o.containment ) { |
4553
|
|
|
this._setContainment(); |
4554
|
|
|
} |
4555
|
|
|
|
4556
|
|
|
if ( o.cursor && o.cursor !== "auto" ) { // cursor option |
4557
|
|
|
body = this.document.find( "body" ); |
4558
|
|
|
|
4559
|
|
|
// Support: IE |
4560
|
|
|
this.storedCursor = body.css( "cursor" ); |
4561
|
|
|
body.css( "cursor", o.cursor ); |
4562
|
|
|
|
4563
|
|
|
this.storedStylesheet = |
4564
|
|
|
$( "<style>*{ cursor: " + o.cursor + " !important; }</style>" ).appendTo( body ); |
4565
|
|
|
} |
4566
|
|
|
|
4567
|
|
|
if ( o.opacity ) { // opacity option |
4568
|
|
|
if ( this.helper.css( "opacity" ) ) { |
4569
|
|
|
this._storedOpacity = this.helper.css( "opacity" ); |
4570
|
|
|
} |
4571
|
|
|
this.helper.css( "opacity", o.opacity ); |
4572
|
|
|
} |
4573
|
|
|
|
4574
|
|
|
if ( o.zIndex ) { // zIndex option |
4575
|
|
|
if ( this.helper.css( "zIndex" ) ) { |
4576
|
|
|
this._storedZIndex = this.helper.css( "zIndex" ); |
4577
|
|
|
} |
4578
|
|
|
this.helper.css( "zIndex", o.zIndex ); |
4579
|
|
|
} |
4580
|
|
|
|
4581
|
|
|
//Prepare scrolling |
4582
|
|
|
if ( this.scrollParent[ 0 ] !== this.document[ 0 ] && |
4583
|
|
|
this.scrollParent[ 0 ].tagName !== "HTML" ) { |
4584
|
|
|
this.overflowOffset = this.scrollParent.offset(); |
4585
|
|
|
} |
4586
|
|
|
|
4587
|
|
|
//Call callbacks |
4588
|
|
|
this._trigger( "start", event, this._uiHash() ); |
4589
|
|
|
|
4590
|
|
|
//Recache the helper size |
4591
|
|
|
if ( !this._preserveHelperProportions ) { |
4592
|
|
|
this._cacheHelperProportions(); |
4593
|
|
|
} |
4594
|
|
|
|
4595
|
|
|
//Post "activate" events to possible containers |
4596
|
|
|
if ( !noActivation ) { |
4597
|
|
|
for ( i = this.containers.length - 1; i >= 0; i-- ) { |
4598
|
|
|
this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) ); |
4599
|
|
|
} |
4600
|
|
|
} |
4601
|
|
|
|
4602
|
|
|
//Prepare possible droppables |
4603
|
|
|
if ( $.ui.ddmanager ) { |
4604
|
|
|
$.ui.ddmanager.current = this; |
4605
|
|
|
} |
4606
|
|
|
|
4607
|
|
|
if ( $.ui.ddmanager && !o.dropBehaviour ) { |
4608
|
|
|
$.ui.ddmanager.prepareOffsets( this, event ); |
4609
|
|
|
} |
4610
|
|
|
|
4611
|
|
|
this.dragging = true; |
4612
|
|
|
|
4613
|
|
|
this._addClass( this.helper, "ui-sortable-helper" ); |
4614
|
|
|
|
4615
|
|
|
// Execute the drag once - this causes the helper not to be visiblebefore getting its |
4616
|
|
|
// correct position |
4617
|
|
|
this._mouseDrag( event ); |
4618
|
|
|
return true; |
4619
|
|
|
|
4620
|
|
|
}, |
4621
|
|
|
|
4622
|
|
|
_mouseDrag: function( event ) { |
4623
|
|
|
var i, item, itemElement, intersection, |
4624
|
|
|
o = this.options, |
4625
|
|
|
scrolled = false; |
4626
|
|
|
|
4627
|
|
|
//Compute the helpers position |
4628
|
|
|
this.position = this._generatePosition( event ); |
4629
|
|
|
this.positionAbs = this._convertPositionTo( "absolute" ); |
4630
|
|
|
|
4631
|
|
|
if ( !this.lastPositionAbs ) { |
4632
|
|
|
this.lastPositionAbs = this.positionAbs; |
4633
|
|
|
} |
4634
|
|
|
|
4635
|
|
|
//Do scrolling |
4636
|
|
|
if ( this.options.scroll ) { |
4637
|
|
|
if ( this.scrollParent[ 0 ] !== this.document[ 0 ] && |
4638
|
|
|
this.scrollParent[ 0 ].tagName !== "HTML" ) { |
4639
|
|
|
|
4640
|
|
|
if ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) - |
4641
|
|
|
event.pageY < o.scrollSensitivity ) { |
4642
|
|
|
this.scrollParent[ 0 ].scrollTop = |
4643
|
|
|
scrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed; |
4644
|
|
|
} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) { |
4645
|
|
|
this.scrollParent[ 0 ].scrollTop = |
4646
|
|
|
scrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed; |
4647
|
|
|
} |
4648
|
|
|
|
4649
|
|
|
if ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) - |
4650
|
|
|
event.pageX < o.scrollSensitivity ) { |
4651
|
|
|
this.scrollParent[ 0 ].scrollLeft = scrolled = |
4652
|
|
|
this.scrollParent[ 0 ].scrollLeft + o.scrollSpeed; |
4653
|
|
|
} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) { |
4654
|
|
|
this.scrollParent[ 0 ].scrollLeft = scrolled = |
4655
|
|
|
this.scrollParent[ 0 ].scrollLeft - o.scrollSpeed; |
4656
|
|
|
} |
4657
|
|
|
|
4658
|
|
|
} else { |
4659
|
|
|
|
4660
|
|
|
if ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) { |
4661
|
|
|
scrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed ); |
4662
|
|
|
} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) < |
4663
|
|
|
o.scrollSensitivity ) { |
4664
|
|
|
scrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed ); |
4665
|
|
|
} |
4666
|
|
|
|
4667
|
|
|
if ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) { |
4668
|
|
|
scrolled = this.document.scrollLeft( |
4669
|
|
|
this.document.scrollLeft() - o.scrollSpeed |
4670
|
|
|
); |
4671
|
|
|
} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) < |
4672
|
|
|
o.scrollSensitivity ) { |
4673
|
|
|
scrolled = this.document.scrollLeft( |
4674
|
|
|
this.document.scrollLeft() + o.scrollSpeed |
4675
|
|
|
); |
4676
|
|
|
} |
4677
|
|
|
|
4678
|
|
|
} |
4679
|
|
|
|
4680
|
|
|
if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) { |
4681
|
|
|
$.ui.ddmanager.prepareOffsets( this, event ); |
4682
|
|
|
} |
4683
|
|
|
} |
4684
|
|
|
|
4685
|
|
|
//Regenerate the absolute position used for position checks |
4686
|
|
|
this.positionAbs = this._convertPositionTo( "absolute" ); |
4687
|
|
|
|
4688
|
|
|
//Set the helper position |
4689
|
|
|
if ( !this.options.axis || this.options.axis !== "y" ) { |
4690
|
|
|
this.helper[ 0 ].style.left = this.position.left + "px"; |
4691
|
|
|
} |
4692
|
|
|
if ( !this.options.axis || this.options.axis !== "x" ) { |
4693
|
|
|
this.helper[ 0 ].style.top = this.position.top + "px"; |
4694
|
|
|
} |
4695
|
|
|
|
4696
|
|
|
//Rearrange |
4697
|
|
|
for ( i = this.items.length - 1; i >= 0; i-- ) { |
4698
|
|
|
|
4699
|
|
|
//Cache variables and intersection, continue if no intersection |
4700
|
|
|
item = this.items[ i ]; |
4701
|
|
|
itemElement = item.item[ 0 ]; |
4702
|
|
|
intersection = this._intersectsWithPointer( item ); |
4703
|
|
|
if ( !intersection ) { |
4704
|
|
|
continue; |
4705
|
|
|
} |
4706
|
|
|
|
4707
|
|
|
// Only put the placeholder inside the current Container, skip all |
4708
|
|
|
// items from other containers. This works because when moving |
4709
|
|
|
// an item from one container to another the |
4710
|
|
|
// currentContainer is switched before the placeholder is moved. |
4711
|
|
|
// |
4712
|
|
|
// Without this, moving items in "sub-sortables" can cause |
4713
|
|
|
// the placeholder to jitter between the outer and inner container. |
4714
|
|
|
if ( item.instance !== this.currentContainer ) { |
4715
|
|
|
continue; |
4716
|
|
|
} |
4717
|
|
|
|
4718
|
|
|
// Cannot intersect with itself |
4719
|
|
|
// no useless actions that have been done before |
4720
|
|
|
// no action if the item moved is the parent of the item checked |
4721
|
|
|
if ( itemElement !== this.currentItem[ 0 ] && |
4722
|
|
|
this.placeholder[ intersection === 1 ? "next" : "prev" ]()[ 0 ] !== itemElement && |
4723
|
|
|
!$.contains( this.placeholder[ 0 ], itemElement ) && |
4724
|
|
|
( this.options.type === "semi-dynamic" ? |
4725
|
|
|
!$.contains( this.element[ 0 ], itemElement ) : |
4726
|
|
|
true |
4727
|
|
|
) |
4728
|
|
|
) { |
4729
|
|
|
|
4730
|
|
|
this.direction = intersection === 1 ? "down" : "up"; |
4731
|
|
|
|
4732
|
|
|
if ( this.options.tolerance === "pointer" || this._intersectsWithSides( item ) ) { |
4733
|
|
|
this._rearrange( event, item ); |
4734
|
|
|
} else { |
4735
|
|
|
break; |
4736
|
|
|
} |
4737
|
|
|
|
4738
|
|
|
this._trigger( "change", event, this._uiHash() ); |
4739
|
|
|
break; |
4740
|
|
|
} |
4741
|
|
|
} |
4742
|
|
|
|
4743
|
|
|
//Post events to containers |
4744
|
|
|
this._contactContainers( event ); |
4745
|
|
|
|
4746
|
|
|
//Interconnect with droppables |
4747
|
|
|
if ( $.ui.ddmanager ) { |
4748
|
|
|
$.ui.ddmanager.drag( this, event ); |
4749
|
|
|
} |
4750
|
|
|
|
4751
|
|
|
//Call callbacks |
4752
|
|
|
this._trigger( "sort", event, this._uiHash() ); |
4753
|
|
|
|
4754
|
|
|
this.lastPositionAbs = this.positionAbs; |
4755
|
|
|
return false; |
4756
|
|
|
|
4757
|
|
|
}, |
4758
|
|
|
|
4759
|
|
|
_mouseStop: function( event, noPropagation ) { |
4760
|
|
|
|
4761
|
|
|
if ( !event ) { |
4762
|
|
|
return; |
|
|
|
|
4763
|
|
|
} |
4764
|
|
|
|
4765
|
|
|
//If we are using droppables, inform the manager about the drop |
4766
|
|
|
if ( $.ui.ddmanager && !this.options.dropBehaviour ) { |
4767
|
|
|
$.ui.ddmanager.drop( this, event ); |
4768
|
|
|
} |
4769
|
|
|
|
4770
|
|
|
if ( this.options.revert ) { |
4771
|
|
|
var that = this, |
4772
|
|
|
cur = this.placeholder.offset(), |
4773
|
|
|
axis = this.options.axis, |
4774
|
|
|
animation = {}; |
4775
|
|
|
|
4776
|
|
|
if ( !axis || axis === "x" ) { |
4777
|
|
|
animation.left = cur.left - this.offset.parent.left - this.margins.left + |
4778
|
|
|
( this.offsetParent[ 0 ] === this.document[ 0 ].body ? |
4779
|
|
|
0 : |
4780
|
|
|
this.offsetParent[ 0 ].scrollLeft |
4781
|
|
|
); |
4782
|
|
|
} |
4783
|
|
|
if ( !axis || axis === "y" ) { |
4784
|
|
|
animation.top = cur.top - this.offset.parent.top - this.margins.top + |
4785
|
|
|
( this.offsetParent[ 0 ] === this.document[ 0 ].body ? |
4786
|
|
|
0 : |
4787
|
|
|
this.offsetParent[ 0 ].scrollTop |
4788
|
|
|
); |
4789
|
|
|
} |
4790
|
|
|
this.reverting = true; |
4791
|
|
|
$( this.helper ).animate( |
4792
|
|
|
animation, |
4793
|
|
|
parseInt( this.options.revert, 10 ) || 500, |
4794
|
|
|
function() { |
4795
|
|
|
that._clear( event ); |
4796
|
|
|
} |
4797
|
|
|
); |
4798
|
|
|
} else { |
4799
|
|
|
this._clear( event, noPropagation ); |
4800
|
|
|
} |
4801
|
|
|
|
4802
|
|
|
return false; |
4803
|
|
|
|
4804
|
|
|
}, |
4805
|
|
|
|
4806
|
|
|
cancel: function() { |
4807
|
|
|
|
4808
|
|
|
if ( this.dragging ) { |
4809
|
|
|
|
4810
|
|
|
this._mouseUp( { target: null } ); |
4811
|
|
|
|
4812
|
|
|
if ( this.options.helper === "original" ) { |
4813
|
|
|
this.currentItem.css( this._storedCSS ); |
4814
|
|
|
this._removeClass( this.currentItem, "ui-sortable-helper" ); |
4815
|
|
|
} else { |
4816
|
|
|
this.currentItem.show(); |
4817
|
|
|
} |
4818
|
|
|
|
4819
|
|
|
//Post deactivating events to containers |
4820
|
|
|
for ( var i = this.containers.length - 1; i >= 0; i-- ) { |
4821
|
|
|
this.containers[ i ]._trigger( "deactivate", null, this._uiHash( this ) ); |
4822
|
|
|
if ( this.containers[ i ].containerCache.over ) { |
4823
|
|
|
this.containers[ i ]._trigger( "out", null, this._uiHash( this ) ); |
4824
|
|
|
this.containers[ i ].containerCache.over = 0; |
4825
|
|
|
} |
4826
|
|
|
} |
4827
|
|
|
|
4828
|
|
|
} |
4829
|
|
|
|
4830
|
|
|
if ( this.placeholder ) { |
4831
|
|
|
|
4832
|
|
|
//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, |
4833
|
|
|
// it unbinds ALL events from the original node! |
4834
|
|
|
if ( this.placeholder[ 0 ].parentNode ) { |
4835
|
|
|
this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] ); |
4836
|
|
|
} |
4837
|
|
|
if ( this.options.helper !== "original" && this.helper && |
4838
|
|
|
this.helper[ 0 ].parentNode ) { |
4839
|
|
|
this.helper.remove(); |
4840
|
|
|
} |
4841
|
|
|
|
4842
|
|
|
$.extend( this, { |
4843
|
|
|
helper: null, |
4844
|
|
|
dragging: false, |
4845
|
|
|
reverting: false, |
4846
|
|
|
_noFinalSort: null |
4847
|
|
|
} ); |
4848
|
|
|
|
4849
|
|
|
if ( this.domPosition.prev ) { |
4850
|
|
|
$( this.domPosition.prev ).after( this.currentItem ); |
4851
|
|
|
} else { |
4852
|
|
|
$( this.domPosition.parent ).prepend( this.currentItem ); |
4853
|
|
|
} |
4854
|
|
|
} |
4855
|
|
|
|
4856
|
|
|
return this; |
4857
|
|
|
|
4858
|
|
|
}, |
4859
|
|
|
|
4860
|
|
|
serialize: function( o ) { |
4861
|
|
|
|
4862
|
|
|
var items = this._getItemsAsjQuery( o && o.connected ), |
4863
|
|
|
str = []; |
4864
|
|
|
o = o || {}; |
4865
|
|
|
|
4866
|
|
|
$( items ).each( function() { |
4867
|
|
|
var res = ( $( o.item || this ).attr( o.attribute || "id" ) || "" ) |
4868
|
|
|
.match( o.expression || ( /(.+)[\-=_](.+)/ ) ); |
4869
|
|
|
if ( res ) { |
4870
|
|
|
str.push( |
4871
|
|
|
( o.key || res[ 1 ] + "[]" ) + |
4872
|
|
|
"=" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) ); |
4873
|
|
|
} |
4874
|
|
|
} ); |
4875
|
|
|
|
4876
|
|
|
if ( !str.length && o.key ) { |
4877
|
|
|
str.push( o.key + "=" ); |
4878
|
|
|
} |
4879
|
|
|
|
4880
|
|
|
return str.join( "&" ); |
4881
|
|
|
|
4882
|
|
|
}, |
4883
|
|
|
|
4884
|
|
|
toArray: function( o ) { |
4885
|
|
|
|
4886
|
|
|
var items = this._getItemsAsjQuery( o && o.connected ), |
4887
|
|
|
ret = []; |
4888
|
|
|
|
4889
|
|
|
o = o || {}; |
4890
|
|
|
|
4891
|
|
|
items.each( function() { |
4892
|
|
|
ret.push( $( o.item || this ).attr( o.attribute || "id" ) || "" ); |
4893
|
|
|
} ); |
4894
|
|
|
return ret; |
4895
|
|
|
|
4896
|
|
|
}, |
4897
|
|
|
|
4898
|
|
|
/* Be careful with the following core functions */ |
4899
|
|
|
_intersectsWith: function( item ) { |
4900
|
|
|
|
4901
|
|
|
var x1 = this.positionAbs.left, |
4902
|
|
|
x2 = x1 + this.helperProportions.width, |
4903
|
|
|
y1 = this.positionAbs.top, |
4904
|
|
|
y2 = y1 + this.helperProportions.height, |
4905
|
|
|
l = item.left, |
4906
|
|
|
r = l + item.width, |
4907
|
|
|
t = item.top, |
4908
|
|
|
b = t + item.height, |
4909
|
|
|
dyClick = this.offset.click.top, |
4910
|
|
|
dxClick = this.offset.click.left, |
4911
|
|
|
isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && |
4912
|
|
|
( y1 + dyClick ) < b ), |
4913
|
|
|
isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && |
4914
|
|
|
( x1 + dxClick ) < r ), |
4915
|
|
|
isOverElement = isOverElementHeight && isOverElementWidth; |
4916
|
|
|
|
4917
|
|
|
if ( this.options.tolerance === "pointer" || |
4918
|
|
|
this.options.forcePointerForContainers || |
4919
|
|
|
( this.options.tolerance !== "pointer" && |
4920
|
|
|
this.helperProportions[ this.floating ? "width" : "height" ] > |
4921
|
|
|
item[ this.floating ? "width" : "height" ] ) |
4922
|
|
|
) { |
4923
|
|
|
return isOverElement; |
4924
|
|
|
} else { |
|
|
|
|
4925
|
|
|
|
4926
|
|
|
return ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half |
4927
|
|
|
x2 - ( this.helperProportions.width / 2 ) < r && // Left Half |
4928
|
|
|
t < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half |
4929
|
|
|
y2 - ( this.helperProportions.height / 2 ) < b ); // Top Half |
4930
|
|
|
|
4931
|
|
|
} |
4932
|
|
|
}, |
4933
|
|
|
|
4934
|
|
|
_intersectsWithPointer: function( item ) { |
4935
|
|
|
var verticalDirection, horizontalDirection, |
4936
|
|
|
isOverElementHeight = ( this.options.axis === "x" ) || |
4937
|
|
|
this._isOverAxis( |
4938
|
|
|
this.positionAbs.top + this.offset.click.top, item.top, item.height ), |
4939
|
|
|
isOverElementWidth = ( this.options.axis === "y" ) || |
4940
|
|
|
this._isOverAxis( |
4941
|
|
|
this.positionAbs.left + this.offset.click.left, item.left, item.width ), |
4942
|
|
|
isOverElement = isOverElementHeight && isOverElementWidth; |
4943
|
|
|
|
4944
|
|
|
if ( !isOverElement ) { |
4945
|
|
|
return false; |
4946
|
|
|
} |
4947
|
|
|
|
4948
|
|
|
verticalDirection = this._getDragVerticalDirection(); |
4949
|
|
|
horizontalDirection = this._getDragHorizontalDirection(); |
4950
|
|
|
|
4951
|
|
|
return this.floating ? |
4952
|
|
|
( ( horizontalDirection === "right" || verticalDirection === "down" ) ? 2 : 1 ) |
4953
|
|
|
: ( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) ); |
4954
|
|
|
|
4955
|
|
|
}, |
4956
|
|
|
|
4957
|
|
|
_intersectsWithSides: function( item ) { |
4958
|
|
|
|
4959
|
|
|
var isOverBottomHalf = this._isOverAxis( this.positionAbs.top + |
4960
|
|
|
this.offset.click.top, item.top + ( item.height / 2 ), item.height ), |
4961
|
|
|
isOverRightHalf = this._isOverAxis( this.positionAbs.left + |
4962
|
|
|
this.offset.click.left, item.left + ( item.width / 2 ), item.width ), |
4963
|
|
|
verticalDirection = this._getDragVerticalDirection(), |
4964
|
|
|
horizontalDirection = this._getDragHorizontalDirection(); |
4965
|
|
|
|
4966
|
|
|
if ( this.floating && horizontalDirection ) { |
4967
|
|
|
return ( ( horizontalDirection === "right" && isOverRightHalf ) || |
4968
|
|
|
( horizontalDirection === "left" && !isOverRightHalf ) ); |
4969
|
|
|
} else { |
|
|
|
|
4970
|
|
|
return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) || |
4971
|
|
|
( verticalDirection === "up" && !isOverBottomHalf ) ); |
4972
|
|
|
} |
4973
|
|
|
|
4974
|
|
|
}, |
4975
|
|
|
|
4976
|
|
|
_getDragVerticalDirection: function() { |
4977
|
|
|
var delta = this.positionAbs.top - this.lastPositionAbs.top; |
4978
|
|
|
return delta !== 0 && ( delta > 0 ? "down" : "up" ); |
4979
|
|
|
}, |
4980
|
|
|
|
4981
|
|
|
_getDragHorizontalDirection: function() { |
4982
|
|
|
var delta = this.positionAbs.left - this.lastPositionAbs.left; |
4983
|
|
|
return delta !== 0 && ( delta > 0 ? "right" : "left" ); |
4984
|
|
|
}, |
4985
|
|
|
|
4986
|
|
|
refresh: function( event ) { |
4987
|
|
|
this._refreshItems( event ); |
4988
|
|
|
this._setHandleClassName(); |
4989
|
|
|
this.refreshPositions(); |
4990
|
|
|
return this; |
4991
|
|
|
}, |
4992
|
|
|
|
4993
|
|
|
_connectWith: function() { |
4994
|
|
|
var options = this.options; |
4995
|
|
|
return options.connectWith.constructor === String ? |
4996
|
|
|
[ options.connectWith ] : |
4997
|
|
|
options.connectWith; |
4998
|
|
|
}, |
4999
|
|
|
|
5000
|
|
|
_getItemsAsjQuery: function( connected ) { |
5001
|
|
|
|
5002
|
|
|
var i, j, cur, inst, |
5003
|
|
|
items = [], |
5004
|
|
|
queries = [], |
5005
|
|
|
connectWith = this._connectWith(); |
5006
|
|
|
|
5007
|
|
|
if ( connectWith && connected ) { |
5008
|
|
|
for ( i = connectWith.length - 1; i >= 0; i-- ) { |
5009
|
|
|
cur = $( connectWith[ i ], this.document[ 0 ] ); |
5010
|
|
|
for ( j = cur.length - 1; j >= 0; j-- ) { |
5011
|
|
|
inst = $.data( cur[ j ], this.widgetFullName ); |
5012
|
|
|
if ( inst && inst !== this && !inst.options.disabled ) { |
5013
|
|
|
queries.push( [ $.isFunction( inst.options.items ) ? |
5014
|
|
|
inst.options.items.call( inst.element ) : |
5015
|
|
|
$( inst.options.items, inst.element ) |
5016
|
|
|
.not( ".ui-sortable-helper" ) |
5017
|
|
|
.not( ".ui-sortable-placeholder" ), inst ] ); |
5018
|
|
|
} |
5019
|
|
|
} |
5020
|
|
|
} |
5021
|
|
|
} |
5022
|
|
|
|
5023
|
|
|
queries.push( [ $.isFunction( this.options.items ) ? |
5024
|
|
|
this.options.items |
5025
|
|
|
.call( this.element, null, { options: this.options, item: this.currentItem } ) : |
5026
|
|
|
$( this.options.items, this.element ) |
5027
|
|
|
.not( ".ui-sortable-helper" ) |
5028
|
|
|
.not( ".ui-sortable-placeholder" ), this ] ); |
5029
|
|
|
|
5030
|
|
|
function addItems() { |
5031
|
|
|
items.push( this ); |
5032
|
|
|
} |
5033
|
|
|
for ( i = queries.length - 1; i >= 0; i-- ) { |
5034
|
|
|
queries[ i ][ 0 ].each( addItems ); |
5035
|
|
|
} |
5036
|
|
|
|
5037
|
|
|
return $( items ); |
5038
|
|
|
|
5039
|
|
|
}, |
5040
|
|
|
|
5041
|
|
|
_removeCurrentsFromItems: function() { |
5042
|
|
|
|
5043
|
|
|
var list = this.currentItem.find( ":data(" + this.widgetName + "-item)" ); |
5044
|
|
|
|
5045
|
|
|
this.items = $.grep( this.items, function( item ) { |
5046
|
|
|
for ( var j = 0; j < list.length; j++ ) { |
5047
|
|
|
if ( list[ j ] === item.item[ 0 ] ) { |
5048
|
|
|
return false; |
5049
|
|
|
} |
5050
|
|
|
} |
5051
|
|
|
return true; |
5052
|
|
|
} ); |
5053
|
|
|
|
5054
|
|
|
}, |
5055
|
|
|
|
5056
|
|
|
_refreshItems: function( event ) { |
5057
|
|
|
|
5058
|
|
|
this.items = []; |
5059
|
|
|
this.containers = [ this ]; |
5060
|
|
|
|
5061
|
|
|
var i, j, cur, inst, targetData, _queries, item, queriesLength, |
5062
|
|
|
items = this.items, |
5063
|
|
|
queries = [ [ $.isFunction( this.options.items ) ? |
5064
|
|
|
this.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) : |
5065
|
|
|
$( this.options.items, this.element ), this ] ], |
5066
|
|
|
connectWith = this._connectWith(); |
5067
|
|
|
|
5068
|
|
|
//Shouldn't be run the first time through due to massive slow-down |
5069
|
|
|
if ( connectWith && this.ready ) { |
5070
|
|
|
for ( i = connectWith.length - 1; i >= 0; i-- ) { |
5071
|
|
|
cur = $( connectWith[ i ], this.document[ 0 ] ); |
5072
|
|
|
for ( j = cur.length - 1; j >= 0; j-- ) { |
5073
|
|
|
inst = $.data( cur[ j ], this.widgetFullName ); |
5074
|
|
|
if ( inst && inst !== this && !inst.options.disabled ) { |
5075
|
|
|
queries.push( [ $.isFunction( inst.options.items ) ? |
5076
|
|
|
inst.options.items |
5077
|
|
|
.call( inst.element[ 0 ], event, { item: this.currentItem } ) : |
5078
|
|
|
$( inst.options.items, inst.element ), inst ] ); |
5079
|
|
|
this.containers.push( inst ); |
5080
|
|
|
} |
5081
|
|
|
} |
5082
|
|
|
} |
5083
|
|
|
} |
5084
|
|
|
|
5085
|
|
|
for ( i = queries.length - 1; i >= 0; i-- ) { |
5086
|
|
|
targetData = queries[ i ][ 1 ]; |
5087
|
|
|
_queries = queries[ i ][ 0 ]; |
5088
|
|
|
|
5089
|
|
|
for ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) { |
5090
|
|
|
item = $( _queries[ j ] ); |
5091
|
|
|
|
5092
|
|
|
// Data for target checking (mouse manager) |
5093
|
|
|
item.data( this.widgetName + "-item", targetData ); |
5094
|
|
|
|
5095
|
|
|
items.push( { |
5096
|
|
|
item: item, |
5097
|
|
|
instance: targetData, |
5098
|
|
|
width: 0, height: 0, |
5099
|
|
|
left: 0, top: 0 |
5100
|
|
|
} ); |
5101
|
|
|
} |
5102
|
|
|
} |
5103
|
|
|
|
5104
|
|
|
}, |
5105
|
|
|
|
5106
|
|
|
refreshPositions: function( fast ) { |
5107
|
|
|
|
5108
|
|
|
// Determine whether items are being displayed horizontally |
5109
|
|
|
this.floating = this.items.length ? |
5110
|
|
|
this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) : |
5111
|
|
|
false; |
5112
|
|
|
|
5113
|
|
|
//This has to be redone because due to the item being moved out/into the offsetParent, |
5114
|
|
|
// the offsetParent's position will change |
5115
|
|
|
if ( this.offsetParent && this.helper ) { |
5116
|
|
|
this.offset.parent = this._getParentOffset(); |
5117
|
|
|
} |
5118
|
|
|
|
5119
|
|
|
var i, item, t, p; |
5120
|
|
|
|
5121
|
|
|
for ( i = this.items.length - 1; i >= 0; i-- ) { |
5122
|
|
|
item = this.items[ i ]; |
5123
|
|
|
|
5124
|
|
|
//We ignore calculating positions of all connected containers when we're not over them |
5125
|
|
|
if ( item.instance !== this.currentContainer && this.currentContainer && |
5126
|
|
|
item.item[ 0 ] !== this.currentItem[ 0 ] ) { |
5127
|
|
|
continue; |
5128
|
|
|
} |
5129
|
|
|
|
5130
|
|
|
t = this.options.toleranceElement ? |
5131
|
|
|
$( this.options.toleranceElement, item.item ) : |
5132
|
|
|
item.item; |
5133
|
|
|
|
5134
|
|
|
if ( !fast ) { |
5135
|
|
|
item.width = t.outerWidth(); |
5136
|
|
|
item.height = t.outerHeight(); |
5137
|
|
|
} |
5138
|
|
|
|
5139
|
|
|
p = t.offset(); |
5140
|
|
|
item.left = p.left; |
5141
|
|
|
item.top = p.top; |
5142
|
|
|
} |
5143
|
|
|
|
5144
|
|
|
if ( this.options.custom && this.options.custom.refreshContainers ) { |
5145
|
|
|
this.options.custom.refreshContainers.call( this ); |
5146
|
|
|
} else { |
5147
|
|
|
for ( i = this.containers.length - 1; i >= 0; i-- ) { |
5148
|
|
|
p = this.containers[ i ].element.offset(); |
5149
|
|
|
this.containers[ i ].containerCache.left = p.left; |
5150
|
|
|
this.containers[ i ].containerCache.top = p.top; |
5151
|
|
|
this.containers[ i ].containerCache.width = |
5152
|
|
|
this.containers[ i ].element.outerWidth(); |
5153
|
|
|
this.containers[ i ].containerCache.height = |
5154
|
|
|
this.containers[ i ].element.outerHeight(); |
5155
|
|
|
} |
5156
|
|
|
} |
5157
|
|
|
|
5158
|
|
|
return this; |
5159
|
|
|
}, |
5160
|
|
|
|
5161
|
|
|
_createPlaceholder: function( that ) { |
5162
|
|
|
that = that || this; |
5163
|
|
|
var className, |
5164
|
|
|
o = that.options; |
5165
|
|
|
|
5166
|
|
|
if ( !o.placeholder || o.placeholder.constructor === String ) { |
5167
|
|
|
className = o.placeholder; |
5168
|
|
|
o.placeholder = { |
5169
|
|
|
element: function() { |
5170
|
|
|
|
5171
|
|
|
var nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(), |
5172
|
|
|
element = $( "<" + nodeName + ">", that.document[ 0 ] ); |
5173
|
|
|
|
5174
|
|
|
that._addClass( element, "ui-sortable-placeholder", |
5175
|
|
|
className || that.currentItem[ 0 ].className ) |
5176
|
|
|
._removeClass( element, "ui-sortable-helper" ); |
5177
|
|
|
|
5178
|
|
|
if ( nodeName === "tbody" ) { |
5179
|
|
|
that._createTrPlaceholder( |
5180
|
|
|
that.currentItem.find( "tr" ).eq( 0 ), |
5181
|
|
|
$( "<tr>", that.document[ 0 ] ).appendTo( element ) |
5182
|
|
|
); |
5183
|
|
|
} else if ( nodeName === "tr" ) { |
5184
|
|
|
that._createTrPlaceholder( that.currentItem, element ); |
5185
|
|
|
} else if ( nodeName === "img" ) { |
5186
|
|
|
element.attr( "src", that.currentItem.attr( "src" ) ); |
5187
|
|
|
} |
5188
|
|
|
|
5189
|
|
|
if ( !className ) { |
5190
|
|
|
element.css( "visibility", "hidden" ); |
5191
|
|
|
} |
5192
|
|
|
|
5193
|
|
|
return element; |
5194
|
|
|
}, |
5195
|
|
|
update: function( container, p ) { |
5196
|
|
|
|
5197
|
|
|
// 1. If a className is set as 'placeholder option, we don't force sizes - |
5198
|
|
|
// the class is responsible for that |
5199
|
|
|
// 2. The option 'forcePlaceholderSize can be enabled to force it even if a |
5200
|
|
|
// class name is specified |
5201
|
|
|
if ( className && !o.forcePlaceholderSize ) { |
5202
|
|
|
return; |
5203
|
|
|
} |
5204
|
|
|
|
5205
|
|
|
//If the element doesn't have a actual height by itself (without styles coming |
5206
|
|
|
// from a stylesheet), it receives the inline height from the dragged item |
5207
|
|
|
if ( !p.height() ) { |
5208
|
|
|
p.height( |
5209
|
|
|
that.currentItem.innerHeight() - |
5210
|
|
|
parseInt( that.currentItem.css( "paddingTop" ) || 0, 10 ) - |
5211
|
|
|
parseInt( that.currentItem.css( "paddingBottom" ) || 0, 10 ) ); |
5212
|
|
|
} |
5213
|
|
|
if ( !p.width() ) { |
5214
|
|
|
p.width( |
5215
|
|
|
that.currentItem.innerWidth() - |
5216
|
|
|
parseInt( that.currentItem.css( "paddingLeft" ) || 0, 10 ) - |
5217
|
|
|
parseInt( that.currentItem.css( "paddingRight" ) || 0, 10 ) ); |
5218
|
|
|
} |
5219
|
|
|
} |
5220
|
|
|
}; |
5221
|
|
|
} |
5222
|
|
|
|
5223
|
|
|
//Create the placeholder |
5224
|
|
|
that.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) ); |
5225
|
|
|
|
5226
|
|
|
//Append it after the actual current item |
5227
|
|
|
that.currentItem.after( that.placeholder ); |
5228
|
|
|
|
5229
|
|
|
//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317) |
5230
|
|
|
o.placeholder.update( that, that.placeholder ); |
5231
|
|
|
|
5232
|
|
|
}, |
5233
|
|
|
|
5234
|
|
|
_createTrPlaceholder: function( sourceTr, targetTr ) { |
5235
|
|
|
var that = this; |
5236
|
|
|
|
5237
|
|
|
sourceTr.children().each( function() { |
5238
|
|
|
$( "<td> </td>", that.document[ 0 ] ) |
5239
|
|
|
.attr( "colspan", $( this ).attr( "colspan" ) || 1 ) |
5240
|
|
|
.appendTo( targetTr ); |
5241
|
|
|
} ); |
5242
|
|
|
}, |
5243
|
|
|
|
5244
|
|
|
_contactContainers: function( event ) { |
5245
|
|
|
var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, |
5246
|
|
|
floating, axis, |
5247
|
|
|
innermostContainer = null, |
5248
|
|
|
innermostIndex = null; |
5249
|
|
|
|
5250
|
|
|
// Get innermost container that intersects with item |
5251
|
|
|
for ( i = this.containers.length - 1; i >= 0; i-- ) { |
5252
|
|
|
|
5253
|
|
|
// Never consider a container that's located within the item itself |
5254
|
|
|
if ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) { |
5255
|
|
|
continue; |
5256
|
|
|
} |
5257
|
|
|
|
5258
|
|
|
if ( this._intersectsWith( this.containers[ i ].containerCache ) ) { |
5259
|
|
|
|
5260
|
|
|
// If we've already found a container and it's more "inner" than this, then continue |
5261
|
|
|
if ( innermostContainer && |
5262
|
|
|
$.contains( |
5263
|
|
|
this.containers[ i ].element[ 0 ], |
5264
|
|
|
innermostContainer.element[ 0 ] ) ) { |
5265
|
|
|
continue; |
5266
|
|
|
} |
5267
|
|
|
|
5268
|
|
|
innermostContainer = this.containers[ i ]; |
5269
|
|
|
innermostIndex = i; |
5270
|
|
|
|
5271
|
|
|
} else { |
5272
|
|
|
|
5273
|
|
|
// container doesn't intersect. trigger "out" event if necessary |
5274
|
|
|
if ( this.containers[ i ].containerCache.over ) { |
5275
|
|
|
this.containers[ i ]._trigger( "out", event, this._uiHash( this ) ); |
5276
|
|
|
this.containers[ i ].containerCache.over = 0; |
5277
|
|
|
} |
5278
|
|
|
} |
5279
|
|
|
|
5280
|
|
|
} |
5281
|
|
|
|
5282
|
|
|
// If no intersecting containers found, return |
5283
|
|
|
if ( !innermostContainer ) { |
5284
|
|
|
return; |
5285
|
|
|
} |
5286
|
|
|
|
5287
|
|
|
// Move the item into the container if it's not there already |
5288
|
|
|
if ( this.containers.length === 1 ) { |
5289
|
|
|
if ( !this.containers[ innermostIndex ].containerCache.over ) { |
5290
|
|
|
this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) ); |
5291
|
|
|
this.containers[ innermostIndex ].containerCache.over = 1; |
5292
|
|
|
} |
5293
|
|
|
} else { |
5294
|
|
|
|
5295
|
|
|
// When entering a new container, we will find the item with the least distance and |
5296
|
|
|
// append our item near it |
5297
|
|
|
dist = 10000; |
5298
|
|
|
itemWithLeastDistance = null; |
5299
|
|
|
floating = innermostContainer.floating || this._isFloating( this.currentItem ); |
5300
|
|
|
posProperty = floating ? "left" : "top"; |
5301
|
|
|
sizeProperty = floating ? "width" : "height"; |
5302
|
|
|
axis = floating ? "pageX" : "pageY"; |
5303
|
|
|
|
5304
|
|
|
for ( j = this.items.length - 1; j >= 0; j-- ) { |
5305
|
|
|
if ( !$.contains( |
5306
|
|
|
this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] ) |
5307
|
|
|
) { |
5308
|
|
|
continue; |
5309
|
|
|
} |
5310
|
|
|
if ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) { |
5311
|
|
|
continue; |
5312
|
|
|
} |
5313
|
|
|
|
5314
|
|
|
cur = this.items[ j ].item.offset()[ posProperty ]; |
5315
|
|
|
nearBottom = false; |
5316
|
|
|
if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) { |
5317
|
|
|
nearBottom = true; |
5318
|
|
|
} |
5319
|
|
|
|
5320
|
|
|
if ( Math.abs( event[ axis ] - cur ) < dist ) { |
5321
|
|
|
dist = Math.abs( event[ axis ] - cur ); |
5322
|
|
|
itemWithLeastDistance = this.items[ j ]; |
5323
|
|
|
this.direction = nearBottom ? "up" : "down"; |
5324
|
|
|
} |
5325
|
|
|
} |
5326
|
|
|
|
5327
|
|
|
//Check if dropOnEmpty is enabled |
5328
|
|
|
if ( !itemWithLeastDistance && !this.options.dropOnEmpty ) { |
5329
|
|
|
return; |
5330
|
|
|
} |
5331
|
|
|
|
5332
|
|
|
if ( this.currentContainer === this.containers[ innermostIndex ] ) { |
5333
|
|
|
if ( !this.currentContainer.containerCache.over ) { |
5334
|
|
|
this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() ); |
5335
|
|
|
this.currentContainer.containerCache.over = 1; |
5336
|
|
|
} |
5337
|
|
|
return; |
5338
|
|
|
} |
5339
|
|
|
|
5340
|
|
|
itemWithLeastDistance ? |
5341
|
|
|
this._rearrange( event, itemWithLeastDistance, null, true ) : |
5342
|
|
|
this._rearrange( event, null, this.containers[ innermostIndex ].element, true ); |
5343
|
|
|
this._trigger( "change", event, this._uiHash() ); |
5344
|
|
|
this.containers[ innermostIndex ]._trigger( "change", event, this._uiHash( this ) ); |
5345
|
|
|
this.currentContainer = this.containers[ innermostIndex ]; |
5346
|
|
|
|
5347
|
|
|
//Update the placeholder |
5348
|
|
|
this.options.placeholder.update( this.currentContainer, this.placeholder ); |
5349
|
|
|
|
5350
|
|
|
this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) ); |
5351
|
|
|
this.containers[ innermostIndex ].containerCache.over = 1; |
5352
|
|
|
} |
5353
|
|
|
|
5354
|
|
|
}, |
5355
|
|
|
|
5356
|
|
|
_createHelper: function( event ) { |
5357
|
|
|
|
5358
|
|
|
var o = this.options, |
5359
|
|
|
helper = $.isFunction( o.helper ) ? |
5360
|
|
|
$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) : |
5361
|
|
|
( o.helper === "clone" ? this.currentItem.clone() : this.currentItem ); |
5362
|
|
|
|
5363
|
|
|
//Add the helper to the DOM if that didn't happen already |
5364
|
|
|
if ( !helper.parents( "body" ).length ) { |
5365
|
|
|
$( o.appendTo !== "parent" ? |
5366
|
|
|
o.appendTo : |
5367
|
|
|
this.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] ); |
5368
|
|
|
} |
5369
|
|
|
|
5370
|
|
|
if ( helper[ 0 ] === this.currentItem[ 0 ] ) { |
5371
|
|
|
this._storedCSS = { |
5372
|
|
|
width: this.currentItem[ 0 ].style.width, |
5373
|
|
|
height: this.currentItem[ 0 ].style.height, |
5374
|
|
|
position: this.currentItem.css( "position" ), |
5375
|
|
|
top: this.currentItem.css( "top" ), |
5376
|
|
|
left: this.currentItem.css( "left" ) |
5377
|
|
|
}; |
5378
|
|
|
} |
5379
|
|
|
|
5380
|
|
|
if ( !helper[ 0 ].style.width || o.forceHelperSize ) { |
5381
|
|
|
helper.width( this.currentItem.width() ); |
5382
|
|
|
} |
5383
|
|
|
if ( !helper[ 0 ].style.height || o.forceHelperSize ) { |
5384
|
|
|
helper.height( this.currentItem.height() ); |
5385
|
|
|
} |
5386
|
|
|
|
5387
|
|
|
return helper; |
5388
|
|
|
|
5389
|
|
|
}, |
5390
|
|
|
|
5391
|
|
View Code Duplication |
_adjustOffsetFromHelper: function( obj ) { |
|
|
|
|
5392
|
|
|
if ( typeof obj === "string" ) { |
5393
|
|
|
obj = obj.split( " " ); |
5394
|
|
|
} |
5395
|
|
|
if ( $.isArray( obj ) ) { |
5396
|
|
|
obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 }; |
5397
|
|
|
} |
5398
|
|
|
if ( "left" in obj ) { |
5399
|
|
|
this.offset.click.left = obj.left + this.margins.left; |
5400
|
|
|
} |
5401
|
|
|
if ( "right" in obj ) { |
5402
|
|
|
this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; |
5403
|
|
|
} |
5404
|
|
|
if ( "top" in obj ) { |
5405
|
|
|
this.offset.click.top = obj.top + this.margins.top; |
5406
|
|
|
} |
5407
|
|
|
if ( "bottom" in obj ) { |
5408
|
|
|
this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; |
5409
|
|
|
} |
5410
|
|
|
}, |
5411
|
|
|
|
5412
|
|
|
_getParentOffset: function() { |
5413
|
|
|
|
5414
|
|
|
//Get the offsetParent and cache its position |
5415
|
|
|
this.offsetParent = this.helper.offsetParent(); |
5416
|
|
|
var po = this.offsetParent.offset(); |
5417
|
|
|
|
5418
|
|
|
// This is a special case where we need to modify a offset calculated on start, since the |
5419
|
|
|
// following happened: |
5420
|
|
|
// 1. The position of the helper is absolute, so it's position is calculated based on the |
5421
|
|
|
// next positioned parent |
5422
|
|
|
// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't |
5423
|
|
|
// the document, which means that the scroll is included in the initial calculation of the |
5424
|
|
|
// offset of the parent, and never recalculated upon drag |
5425
|
|
|
if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== this.document[ 0 ] && |
5426
|
|
|
$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) { |
5427
|
|
|
po.left += this.scrollParent.scrollLeft(); |
5428
|
|
|
po.top += this.scrollParent.scrollTop(); |
5429
|
|
|
} |
5430
|
|
|
|
5431
|
|
|
// This needs to be actually done for all browsers, since pageX/pageY includes this |
5432
|
|
|
// information with an ugly IE fix |
5433
|
|
|
if ( this.offsetParent[ 0 ] === this.document[ 0 ].body || |
5434
|
|
|
( this.offsetParent[ 0 ].tagName && |
5435
|
|
|
this.offsetParent[ 0 ].tagName.toLowerCase() === "html" && $.ui.ie ) ) { |
5436
|
|
|
po = { top: 0, left: 0 }; |
5437
|
|
|
} |
5438
|
|
|
|
5439
|
|
|
return { |
5440
|
|
|
top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ), |
5441
|
|
|
left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 ) |
5442
|
|
|
}; |
5443
|
|
|
|
5444
|
|
|
}, |
5445
|
|
|
|
5446
|
|
|
_getRelativeOffset: function() { |
5447
|
|
|
|
5448
|
|
|
if ( this.cssPosition === "relative" ) { |
5449
|
|
|
var p = this.currentItem.position(); |
5450
|
|
|
return { |
5451
|
|
|
top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) + |
5452
|
|
|
this.scrollParent.scrollTop(), |
5453
|
|
|
left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) + |
5454
|
|
|
this.scrollParent.scrollLeft() |
5455
|
|
|
}; |
5456
|
|
|
} else { |
|
|
|
|
5457
|
|
|
return { top: 0, left: 0 }; |
5458
|
|
|
} |
5459
|
|
|
|
5460
|
|
|
}, |
5461
|
|
|
|
5462
|
|
|
_cacheMargins: function() { |
5463
|
|
|
this.margins = { |
5464
|
|
|
left: ( parseInt( this.currentItem.css( "marginLeft" ), 10 ) || 0 ), |
5465
|
|
|
top: ( parseInt( this.currentItem.css( "marginTop" ), 10 ) || 0 ) |
5466
|
|
|
}; |
5467
|
|
|
}, |
5468
|
|
|
|
5469
|
|
|
_cacheHelperProportions: function() { |
5470
|
|
|
this.helperProportions = { |
5471
|
|
|
width: this.helper.outerWidth(), |
5472
|
|
|
height: this.helper.outerHeight() |
5473
|
|
|
}; |
5474
|
|
|
}, |
5475
|
|
|
|
5476
|
|
|
_setContainment: function() { |
5477
|
|
|
|
5478
|
|
|
var ce, co, over, |
5479
|
|
|
o = this.options; |
5480
|
|
|
if ( o.containment === "parent" ) { |
5481
|
|
|
o.containment = this.helper[ 0 ].parentNode; |
5482
|
|
|
} |
5483
|
|
|
if ( o.containment === "document" || o.containment === "window" ) { |
5484
|
|
|
this.containment = [ |
5485
|
|
|
0 - this.offset.relative.left - this.offset.parent.left, |
5486
|
|
|
0 - this.offset.relative.top - this.offset.parent.top, |
5487
|
|
|
o.containment === "document" ? |
5488
|
|
|
this.document.width() : |
5489
|
|
|
this.window.width() - this.helperProportions.width - this.margins.left, |
5490
|
|
|
( o.containment === "document" ? |
5491
|
|
|
( this.document.height() || document.body.parentNode.scrollHeight ) : |
5492
|
|
|
this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight |
5493
|
|
|
) - this.helperProportions.height - this.margins.top |
5494
|
|
|
]; |
5495
|
|
|
} |
5496
|
|
|
|
5497
|
|
|
if ( !( /^(document|window|parent)$/ ).test( o.containment ) ) { |
5498
|
|
|
ce = $( o.containment )[ 0 ]; |
5499
|
|
|
co = $( o.containment ).offset(); |
5500
|
|
|
over = ( $( ce ).css( "overflow" ) !== "hidden" ); |
5501
|
|
|
|
5502
|
|
|
this.containment = [ |
5503
|
|
|
co.left + ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) + |
5504
|
|
|
( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left, |
5505
|
|
|
co.top + ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) + |
5506
|
|
|
( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top, |
5507
|
|
|
co.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) - |
5508
|
|
|
( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) - |
5509
|
|
|
( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) - |
5510
|
|
|
this.helperProportions.width - this.margins.left, |
5511
|
|
|
co.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - |
5512
|
|
|
( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) - |
5513
|
|
|
( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) - |
5514
|
|
|
this.helperProportions.height - this.margins.top |
5515
|
|
|
]; |
5516
|
|
|
} |
5517
|
|
|
|
5518
|
|
|
}, |
5519
|
|
|
|
5520
|
|
|
_convertPositionTo: function( d, pos ) { |
5521
|
|
|
|
5522
|
|
|
if ( !pos ) { |
5523
|
|
|
pos = this.position; |
5524
|
|
|
} |
5525
|
|
|
var mod = d === "absolute" ? 1 : -1, |
5526
|
|
|
scroll = this.cssPosition === "absolute" && |
5527
|
|
|
!( this.scrollParent[ 0 ] !== this.document[ 0 ] && |
5528
|
|
|
$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? |
5529
|
|
|
this.offsetParent : |
5530
|
|
|
this.scrollParent, |
5531
|
|
|
scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName ); |
5532
|
|
|
|
5533
|
|
|
return { |
5534
|
|
|
top: ( |
5535
|
|
|
|
5536
|
|
|
// The absolute mouse position |
5537
|
|
|
pos.top + |
5538
|
|
|
|
5539
|
|
|
// Only for relative positioned nodes: Relative offset from element to offset parent |
5540
|
|
|
this.offset.relative.top * mod + |
5541
|
|
|
|
5542
|
|
|
// The offsetParent's offset without borders (offset + border) |
5543
|
|
|
this.offset.parent.top * mod - |
5544
|
|
|
( ( this.cssPosition === "fixed" ? |
5545
|
|
|
-this.scrollParent.scrollTop() : |
5546
|
|
|
( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod ) |
5547
|
|
|
), |
5548
|
|
|
left: ( |
5549
|
|
|
|
5550
|
|
|
// The absolute mouse position |
5551
|
|
|
pos.left + |
5552
|
|
|
|
5553
|
|
|
// Only for relative positioned nodes: Relative offset from element to offset parent |
5554
|
|
|
this.offset.relative.left * mod + |
5555
|
|
|
|
5556
|
|
|
// The offsetParent's offset without borders (offset + border) |
5557
|
|
|
this.offset.parent.left * mod - |
5558
|
|
|
( ( this.cssPosition === "fixed" ? |
5559
|
|
|
-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : |
5560
|
|
|
scroll.scrollLeft() ) * mod ) |
5561
|
|
|
) |
5562
|
|
|
}; |
5563
|
|
|
|
5564
|
|
|
}, |
5565
|
|
|
|
5566
|
|
|
_generatePosition: function( event ) { |
5567
|
|
|
|
5568
|
|
|
var top, left, |
5569
|
|
|
o = this.options, |
5570
|
|
|
pageX = event.pageX, |
5571
|
|
|
pageY = event.pageY, |
5572
|
|
|
scroll = this.cssPosition === "absolute" && |
5573
|
|
|
!( this.scrollParent[ 0 ] !== this.document[ 0 ] && |
5574
|
|
|
$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? |
5575
|
|
|
this.offsetParent : |
5576
|
|
|
this.scrollParent, |
5577
|
|
|
scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName ); |
5578
|
|
|
|
5579
|
|
|
// This is another very weird special case that only happens for relative elements: |
5580
|
|
|
// 1. If the css position is relative |
5581
|
|
|
// 2. and the scroll parent is the document or similar to the offset parent |
5582
|
|
|
// we have to refresh the relative offset during the scroll so there are no jumps |
5583
|
|
|
if ( this.cssPosition === "relative" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] && |
5584
|
|
|
this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) { |
5585
|
|
|
this.offset.relative = this._getRelativeOffset(); |
5586
|
|
|
} |
5587
|
|
|
|
5588
|
|
|
/* |
5589
|
|
|
* - Position constraining - |
5590
|
|
|
* Constrain the position to a mix of grid, containment. |
5591
|
|
|
*/ |
5592
|
|
|
|
5593
|
|
|
if ( this.originalPosition ) { //If we are not dragging yet, we won't check for options |
5594
|
|
|
|
5595
|
|
|
if ( this.containment ) { |
5596
|
|
|
if ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) { |
5597
|
|
|
pageX = this.containment[ 0 ] + this.offset.click.left; |
5598
|
|
|
} |
5599
|
|
|
if ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) { |
5600
|
|
|
pageY = this.containment[ 1 ] + this.offset.click.top; |
5601
|
|
|
} |
5602
|
|
|
if ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) { |
5603
|
|
|
pageX = this.containment[ 2 ] + this.offset.click.left; |
5604
|
|
|
} |
5605
|
|
|
if ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) { |
5606
|
|
|
pageY = this.containment[ 3 ] + this.offset.click.top; |
5607
|
|
|
} |
5608
|
|
|
} |
5609
|
|
|
|
5610
|
|
View Code Duplication |
if ( o.grid ) { |
|
|
|
|
5611
|
|
|
top = this.originalPageY + Math.round( ( pageY - this.originalPageY ) / |
5612
|
|
|
o.grid[ 1 ] ) * o.grid[ 1 ]; |
5613
|
|
|
pageY = this.containment ? |
5614
|
|
|
( ( top - this.offset.click.top >= this.containment[ 1 ] && |
5615
|
|
|
top - this.offset.click.top <= this.containment[ 3 ] ) ? |
5616
|
|
|
top : |
5617
|
|
|
( ( top - this.offset.click.top >= this.containment[ 1 ] ) ? |
5618
|
|
|
top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : |
5619
|
|
|
top; |
5620
|
|
|
|
5621
|
|
|
left = this.originalPageX + Math.round( ( pageX - this.originalPageX ) / |
5622
|
|
|
o.grid[ 0 ] ) * o.grid[ 0 ]; |
5623
|
|
|
pageX = this.containment ? |
5624
|
|
|
( ( left - this.offset.click.left >= this.containment[ 0 ] && |
5625
|
|
|
left - this.offset.click.left <= this.containment[ 2 ] ) ? |
5626
|
|
|
left : |
5627
|
|
|
( ( left - this.offset.click.left >= this.containment[ 0 ] ) ? |
5628
|
|
|
left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : |
5629
|
|
|
left; |
5630
|
|
|
} |
5631
|
|
|
|
5632
|
|
|
} |
5633
|
|
|
|
5634
|
|
|
return { |
5635
|
|
|
top: ( |
5636
|
|
|
|
5637
|
|
|
// The absolute mouse position |
5638
|
|
|
pageY - |
5639
|
|
|
|
5640
|
|
|
// Click offset (relative to the element) |
5641
|
|
|
this.offset.click.top - |
5642
|
|
|
|
5643
|
|
|
// Only for relative positioned nodes: Relative offset from element to offset parent |
5644
|
|
|
this.offset.relative.top - |
5645
|
|
|
|
5646
|
|
|
// The offsetParent's offset without borders (offset + border) |
5647
|
|
|
this.offset.parent.top + |
5648
|
|
|
( ( this.cssPosition === "fixed" ? |
5649
|
|
|
-this.scrollParent.scrollTop() : |
5650
|
|
|
( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) ) |
5651
|
|
|
), |
5652
|
|
|
left: ( |
5653
|
|
|
|
5654
|
|
|
// The absolute mouse position |
5655
|
|
|
pageX - |
5656
|
|
|
|
5657
|
|
|
// Click offset (relative to the element) |
5658
|
|
|
this.offset.click.left - |
5659
|
|
|
|
5660
|
|
|
// Only for relative positioned nodes: Relative offset from element to offset parent |
5661
|
|
|
this.offset.relative.left - |
5662
|
|
|
|
5663
|
|
|
// The offsetParent's offset without borders (offset + border) |
5664
|
|
|
this.offset.parent.left + |
5665
|
|
|
( ( this.cssPosition === "fixed" ? |
5666
|
|
|
-this.scrollParent.scrollLeft() : |
5667
|
|
|
scrollIsRootNode ? 0 : scroll.scrollLeft() ) ) |
5668
|
|
|
) |
5669
|
|
|
}; |
5670
|
|
|
|
5671
|
|
|
}, |
5672
|
|
|
|
5673
|
|
|
_rearrange: function( event, i, a, hardRefresh ) { |
5674
|
|
|
|
5675
|
|
|
a ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) : |
5676
|
|
|
i.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ], |
5677
|
|
|
( this.direction === "down" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) ); |
5678
|
|
|
|
5679
|
|
|
//Various things done here to improve the performance: |
5680
|
|
|
// 1. we create a setTimeout, that calls refreshPositions |
5681
|
|
|
// 2. on the instance, we have a counter variable, that get's higher after every append |
5682
|
|
|
// 3. on the local scope, we copy the counter variable, and check in the timeout, |
5683
|
|
|
// if it's still the same |
5684
|
|
|
// 4. this lets only the last addition to the timeout stack through |
5685
|
|
|
this.counter = this.counter ? ++this.counter : 1; |
5686
|
|
|
var counter = this.counter; |
5687
|
|
|
|
5688
|
|
|
this._delay( function() { |
5689
|
|
|
if ( counter === this.counter ) { |
5690
|
|
|
|
5691
|
|
|
//Precompute after each DOM insertion, NOT on mousemove |
5692
|
|
|
this.refreshPositions( !hardRefresh ); |
5693
|
|
|
} |
5694
|
|
|
} ); |
5695
|
|
|
|
5696
|
|
|
}, |
5697
|
|
|
|
5698
|
|
|
_clear: function( event, noPropagation ) { |
5699
|
|
|
|
5700
|
|
|
this.reverting = false; |
5701
|
|
|
|
5702
|
|
|
// We delay all events that have to be triggered to after the point where the placeholder |
5703
|
|
|
// has been removed and everything else normalized again |
5704
|
|
|
var i, |
5705
|
|
|
delayedTriggers = []; |
5706
|
|
|
|
5707
|
|
|
// We first have to update the dom position of the actual currentItem |
5708
|
|
|
// Note: don't do it if the current item is already removed (by a user), or it gets |
5709
|
|
|
// reappended (see #4088) |
5710
|
|
|
if ( !this._noFinalSort && this.currentItem.parent().length ) { |
5711
|
|
|
this.placeholder.before( this.currentItem ); |
5712
|
|
|
} |
5713
|
|
|
this._noFinalSort = null; |
5714
|
|
|
|
5715
|
|
|
if ( this.helper[ 0 ] === this.currentItem[ 0 ] ) { |
5716
|
|
|
for ( i in this._storedCSS ) { |
5717
|
|
|
if ( this._storedCSS[ i ] === "auto" || this._storedCSS[ i ] === "static" ) { |
5718
|
|
|
this._storedCSS[ i ] = ""; |
5719
|
|
|
} |
5720
|
|
|
} |
5721
|
|
|
this.currentItem.css( this._storedCSS ); |
5722
|
|
|
this._removeClass( this.currentItem, "ui-sortable-helper" ); |
5723
|
|
|
} else { |
5724
|
|
|
this.currentItem.show(); |
5725
|
|
|
} |
5726
|
|
|
|
5727
|
|
|
if ( this.fromOutside && !noPropagation ) { |
5728
|
|
|
delayedTriggers.push( function( event ) { |
5729
|
|
|
this._trigger( "receive", event, this._uiHash( this.fromOutside ) ); |
5730
|
|
|
} ); |
5731
|
|
|
} |
5732
|
|
|
if ( ( this.fromOutside || |
5733
|
|
|
this.domPosition.prev !== |
5734
|
|
|
this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] || |
5735
|
|
|
this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) { |
5736
|
|
|
|
5737
|
|
|
// Trigger update callback if the DOM position has changed |
5738
|
|
|
delayedTriggers.push( function( event ) { |
5739
|
|
|
this._trigger( "update", event, this._uiHash() ); |
5740
|
|
|
} ); |
5741
|
|
|
} |
5742
|
|
|
|
5743
|
|
|
// Check if the items Container has Changed and trigger appropriate |
5744
|
|
|
// events. |
5745
|
|
|
if ( this !== this.currentContainer ) { |
5746
|
|
|
if ( !noPropagation ) { |
5747
|
|
|
delayedTriggers.push( function( event ) { |
5748
|
|
|
this._trigger( "remove", event, this._uiHash() ); |
5749
|
|
|
} ); |
5750
|
|
|
delayedTriggers.push( ( function( c ) { |
5751
|
|
|
return function( event ) { |
5752
|
|
|
c._trigger( "receive", event, this._uiHash( this ) ); |
5753
|
|
|
}; |
5754
|
|
|
} ).call( this, this.currentContainer ) ); |
5755
|
|
|
delayedTriggers.push( ( function( c ) { |
5756
|
|
|
return function( event ) { |
5757
|
|
|
c._trigger( "update", event, this._uiHash( this ) ); |
5758
|
|
|
}; |
5759
|
|
|
} ).call( this, this.currentContainer ) ); |
5760
|
|
|
} |
5761
|
|
|
} |
5762
|
|
|
|
5763
|
|
|
//Post events to containers |
5764
|
|
|
function delayEvent( type, instance, container ) { |
5765
|
|
|
return function( event ) { |
5766
|
|
|
container._trigger( type, event, instance._uiHash( instance ) ); |
5767
|
|
|
}; |
5768
|
|
|
} |
5769
|
|
|
for ( i = this.containers.length - 1; i >= 0; i-- ) { |
5770
|
|
|
if ( !noPropagation ) { |
5771
|
|
|
delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) ); |
5772
|
|
|
} |
5773
|
|
|
if ( this.containers[ i ].containerCache.over ) { |
5774
|
|
|
delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) ); |
5775
|
|
|
this.containers[ i ].containerCache.over = 0; |
5776
|
|
|
} |
5777
|
|
|
} |
5778
|
|
|
|
5779
|
|
|
//Do what was originally in plugins |
5780
|
|
|
if ( this.storedCursor ) { |
5781
|
|
|
this.document.find( "body" ).css( "cursor", this.storedCursor ); |
5782
|
|
|
this.storedStylesheet.remove(); |
5783
|
|
|
} |
5784
|
|
|
if ( this._storedOpacity ) { |
5785
|
|
|
this.helper.css( "opacity", this._storedOpacity ); |
5786
|
|
|
} |
5787
|
|
|
if ( this._storedZIndex ) { |
5788
|
|
|
this.helper.css( "zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex ); |
5789
|
|
|
} |
5790
|
|
|
|
5791
|
|
|
this.dragging = false; |
5792
|
|
|
|
5793
|
|
|
if ( !noPropagation ) { |
5794
|
|
|
this._trigger( "beforeStop", event, this._uiHash() ); |
5795
|
|
|
} |
5796
|
|
|
|
5797
|
|
|
//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, |
5798
|
|
|
// it unbinds ALL events from the original node! |
5799
|
|
|
this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] ); |
5800
|
|
|
|
5801
|
|
|
if ( !this.cancelHelperRemoval ) { |
5802
|
|
|
if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) { |
5803
|
|
|
this.helper.remove(); |
5804
|
|
|
} |
5805
|
|
|
this.helper = null; |
5806
|
|
|
} |
5807
|
|
|
|
5808
|
|
|
if ( !noPropagation ) { |
5809
|
|
|
for ( i = 0; i < delayedTriggers.length; i++ ) { |
5810
|
|
|
|
5811
|
|
|
// Trigger all delayed events |
5812
|
|
|
delayedTriggers[ i ].call( this, event ); |
5813
|
|
|
} |
5814
|
|
|
this._trigger( "stop", event, this._uiHash() ); |
5815
|
|
|
} |
5816
|
|
|
|
5817
|
|
|
this.fromOutside = false; |
5818
|
|
|
return !this.cancelHelperRemoval; |
5819
|
|
|
|
5820
|
|
|
}, |
5821
|
|
|
|
5822
|
|
|
_trigger: function() { |
5823
|
|
|
if ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) { |
5824
|
|
|
this.cancel(); |
5825
|
|
|
} |
5826
|
|
|
}, |
5827
|
|
|
|
5828
|
|
|
_uiHash: function( _inst ) { |
5829
|
|
|
var inst = _inst || this; |
5830
|
|
|
return { |
5831
|
|
|
helper: inst.helper, |
5832
|
|
|
placeholder: inst.placeholder || $( [] ), |
5833
|
|
|
position: inst.position, |
5834
|
|
|
originalPosition: inst.originalPosition, |
5835
|
|
|
offset: inst.positionAbs, |
5836
|
|
|
item: inst.currentItem, |
5837
|
|
|
sender: _inst ? _inst.element : null |
5838
|
|
|
}; |
5839
|
|
|
} |
5840
|
|
|
|
5841
|
|
|
} ); |
5842
|
|
|
|
5843
|
|
|
|
5844
|
|
|
/*! |
5845
|
|
|
* jQuery UI Effects 1.12.0 |
5846
|
|
|
* http://jqueryui.com |
5847
|
|
|
* |
5848
|
|
|
* Copyright jQuery Foundation and other contributors |
5849
|
|
|
* Released under the MIT license. |
5850
|
|
|
* http://jquery.org/license |
5851
|
|
|
*/ |
5852
|
|
|
|
5853
|
|
|
//>>label: Effects Core |
5854
|
|
|
//>>group: Effects |
5855
|
|
|
// jscs:disable maximumLineLength |
5856
|
|
|
//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects. |
5857
|
|
|
// jscs:enable maximumLineLength |
5858
|
|
|
//>>docs: http://api.jqueryui.com/category/effects-core/ |
5859
|
|
|
//>>demos: http://jqueryui.com/effect/ |
5860
|
|
|
|
5861
|
|
|
|
5862
|
|
|
|
5863
|
|
|
var dataSpace = "ui-effects-", |
5864
|
|
|
dataSpaceStyle = "ui-effects-style", |
5865
|
|
|
dataSpaceAnimated = "ui-effects-animated", |
5866
|
|
|
|
5867
|
|
|
// Create a local jQuery because jQuery Color relies on it and the |
5868
|
|
|
// global may not exist with AMD and a custom build (#10199) |
5869
|
|
|
jQuery = $; |
5870
|
|
|
|
5871
|
|
|
$.effects = { |
5872
|
|
|
effect: {} |
5873
|
|
|
}; |
5874
|
|
|
|
5875
|
|
|
/*! |
5876
|
|
|
* jQuery Color Animations v2.1.2 |
5877
|
|
|
* https://github.com/jquery/jquery-color |
5878
|
|
|
* |
5879
|
|
|
* Copyright 2014 jQuery Foundation and other contributors |
5880
|
|
|
* Released under the MIT license. |
5881
|
|
|
* http://jquery.org/license |
5882
|
|
|
* |
5883
|
|
|
* Date: Wed Jan 16 08:47:09 2013 -0600 |
5884
|
|
|
*/ |
5885
|
|
|
( function( jQuery, undefined ) { |
5886
|
|
|
|
5887
|
|
|
var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor " + |
5888
|
|
|
"borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor", |
5889
|
|
|
|
5890
|
|
|
// Plusequals test for += 100 -= 100 |
5891
|
|
|
rplusequals = /^([\-+])=\s*(\d+\.?\d*)/, |
5892
|
|
|
|
5893
|
|
|
// A set of RE's that can match strings and generate color tuples. |
5894
|
|
|
stringParsers = [ { |
5895
|
|
|
re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, |
5896
|
|
|
parse: function( execResult ) { |
5897
|
|
|
return [ |
5898
|
|
|
execResult[ 1 ], |
5899
|
|
|
execResult[ 2 ], |
5900
|
|
|
execResult[ 3 ], |
5901
|
|
|
execResult[ 4 ] |
5902
|
|
|
]; |
5903
|
|
|
} |
5904
|
|
|
}, { |
5905
|
|
|
re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, |
5906
|
|
|
parse: function( execResult ) { |
5907
|
|
|
return [ |
5908
|
|
|
execResult[ 1 ] * 2.55, |
5909
|
|
|
execResult[ 2 ] * 2.55, |
5910
|
|
|
execResult[ 3 ] * 2.55, |
5911
|
|
|
execResult[ 4 ] |
5912
|
|
|
]; |
5913
|
|
|
} |
5914
|
|
|
}, { |
5915
|
|
|
|
5916
|
|
|
// This regex ignores A-F because it's compared against an already lowercased string |
5917
|
|
|
re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/, |
5918
|
|
|
parse: function( execResult ) { |
5919
|
|
|
return [ |
5920
|
|
|
parseInt( execResult[ 1 ], 16 ), |
5921
|
|
|
parseInt( execResult[ 2 ], 16 ), |
5922
|
|
|
parseInt( execResult[ 3 ], 16 ) |
5923
|
|
|
]; |
5924
|
|
|
} |
5925
|
|
|
}, { |
5926
|
|
|
|
5927
|
|
|
// This regex ignores A-F because it's compared against an already lowercased string |
5928
|
|
|
re: /#([a-f0-9])([a-f0-9])([a-f0-9])/, |
5929
|
|
|
parse: function( execResult ) { |
5930
|
|
|
return [ |
5931
|
|
|
parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ), |
5932
|
|
|
parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ), |
5933
|
|
|
parseInt( execResult[ 3 ] + execResult[ 3 ], 16 ) |
5934
|
|
|
]; |
5935
|
|
|
} |
5936
|
|
|
}, { |
5937
|
|
|
re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, |
5938
|
|
|
space: "hsla", |
5939
|
|
|
parse: function( execResult ) { |
5940
|
|
|
return [ |
5941
|
|
|
execResult[ 1 ], |
5942
|
|
|
execResult[ 2 ] / 100, |
5943
|
|
|
execResult[ 3 ] / 100, |
5944
|
|
|
execResult[ 4 ] |
5945
|
|
|
]; |
5946
|
|
|
} |
5947
|
|
|
} ], |
5948
|
|
|
|
5949
|
|
|
// JQuery.Color( ) |
5950
|
|
|
color = jQuery.Color = function( color, green, blue, alpha ) { |
5951
|
|
|
return new jQuery.Color.fn.parse( color, green, blue, alpha ); |
5952
|
|
|
}, |
5953
|
|
|
spaces = { |
5954
|
|
|
rgba: { |
5955
|
|
|
props: { |
5956
|
|
|
red: { |
5957
|
|
|
idx: 0, |
5958
|
|
|
type: "byte" |
5959
|
|
|
}, |
5960
|
|
|
green: { |
5961
|
|
|
idx: 1, |
5962
|
|
|
type: "byte" |
5963
|
|
|
}, |
5964
|
|
|
blue: { |
5965
|
|
|
idx: 2, |
5966
|
|
|
type: "byte" |
5967
|
|
|
} |
5968
|
|
|
} |
5969
|
|
|
}, |
5970
|
|
|
|
5971
|
|
|
hsla: { |
5972
|
|
|
props: { |
5973
|
|
|
hue: { |
5974
|
|
|
idx: 0, |
5975
|
|
|
type: "degrees" |
5976
|
|
|
}, |
5977
|
|
|
saturation: { |
5978
|
|
|
idx: 1, |
5979
|
|
|
type: "percent" |
5980
|
|
|
}, |
5981
|
|
|
lightness: { |
5982
|
|
|
idx: 2, |
5983
|
|
|
type: "percent" |
5984
|
|
|
} |
5985
|
|
|
} |
5986
|
|
|
} |
5987
|
|
|
}, |
5988
|
|
|
propTypes = { |
5989
|
|
|
"byte": { |
5990
|
|
|
floor: true, |
5991
|
|
|
max: 255 |
5992
|
|
|
}, |
5993
|
|
|
"percent": { |
5994
|
|
|
max: 1 |
5995
|
|
|
}, |
5996
|
|
|
"degrees": { |
5997
|
|
|
mod: 360, |
5998
|
|
|
floor: true |
5999
|
|
|
} |
6000
|
|
|
}, |
6001
|
|
|
support = color.support = {}, |
6002
|
|
|
|
6003
|
|
|
// Element for support tests |
6004
|
|
|
supportElem = jQuery( "<p>" )[ 0 ], |
6005
|
|
|
|
6006
|
|
|
// Colors = jQuery.Color.names |
6007
|
|
|
colors, |
6008
|
|
|
|
6009
|
|
|
// Local aliases of functions called often |
6010
|
|
|
each = jQuery.each; |
6011
|
|
|
|
6012
|
|
|
// Determine rgba support immediately |
6013
|
|
|
supportElem.style.cssText = "background-color:rgba(1,1,1,.5)"; |
6014
|
|
|
support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1; |
6015
|
|
|
|
6016
|
|
|
// Define cache name and alpha properties |
6017
|
|
|
// for rgba and hsla spaces |
6018
|
|
|
each( spaces, function( spaceName, space ) { |
6019
|
|
|
space.cache = "_" + spaceName; |
6020
|
|
|
space.props.alpha = { |
6021
|
|
|
idx: 3, |
6022
|
|
|
type: "percent", |
6023
|
|
|
def: 1 |
6024
|
|
|
}; |
6025
|
|
|
} ); |
6026
|
|
|
|
6027
|
|
|
function clamp( value, prop, allowEmpty ) { |
6028
|
|
|
var type = propTypes[ prop.type ] || {}; |
6029
|
|
|
|
6030
|
|
|
if ( value == null ) { |
|
|
|
|
6031
|
|
|
return ( allowEmpty || !prop.def ) ? null : prop.def; |
6032
|
|
|
} |
6033
|
|
|
|
6034
|
|
|
// ~~ is an short way of doing floor for positive numbers |
6035
|
|
|
value = type.floor ? ~~value : parseFloat( value ); |
6036
|
|
|
|
6037
|
|
|
// IE will pass in empty strings as value for alpha, |
6038
|
|
|
// which will hit this case |
6039
|
|
|
if ( isNaN( value ) ) { |
6040
|
|
|
return prop.def; |
6041
|
|
|
} |
6042
|
|
|
|
6043
|
|
|
if ( type.mod ) { |
6044
|
|
|
|
6045
|
|
|
// We add mod before modding to make sure that negatives values |
6046
|
|
|
// get converted properly: -10 -> 350 |
6047
|
|
|
return ( value + type.mod ) % type.mod; |
6048
|
|
|
} |
6049
|
|
|
|
6050
|
|
|
// For now all property types without mod have min and max |
6051
|
|
|
return 0 > value ? 0 : type.max < value ? type.max : value; |
6052
|
|
|
} |
6053
|
|
|
|
6054
|
|
|
function stringParse( string ) { |
6055
|
|
|
var inst = color(), |
6056
|
|
|
rgba = inst._rgba = []; |
6057
|
|
|
|
6058
|
|
|
string = string.toLowerCase(); |
6059
|
|
|
|
6060
|
|
|
each( stringParsers, function( i, parser ) { |
6061
|
|
|
var parsed, |
6062
|
|
|
match = parser.re.exec( string ), |
6063
|
|
|
values = match && parser.parse( match ), |
6064
|
|
|
spaceName = parser.space || "rgba"; |
6065
|
|
|
|
6066
|
|
|
if ( values ) { |
|
|
|
|
6067
|
|
|
parsed = inst[ spaceName ]( values ); |
6068
|
|
|
|
6069
|
|
|
// If this was an rgba parse the assignment might happen twice |
6070
|
|
|
// oh well.... |
6071
|
|
|
inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ]; |
6072
|
|
|
rgba = inst._rgba = parsed._rgba; |
6073
|
|
|
|
6074
|
|
|
// Exit each( stringParsers ) here because we matched |
6075
|
|
|
return false; |
6076
|
|
|
} |
6077
|
|
|
} ); |
6078
|
|
|
|
6079
|
|
|
// Found a stringParser that handled it |
6080
|
|
|
if ( rgba.length ) { |
6081
|
|
|
|
6082
|
|
|
// If this came from a parsed string, force "transparent" when alpha is 0 |
6083
|
|
|
// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0) |
6084
|
|
|
if ( rgba.join() === "0,0,0,0" ) { |
6085
|
|
|
jQuery.extend( rgba, colors.transparent ); |
6086
|
|
|
} |
6087
|
|
|
return inst; |
6088
|
|
|
} |
6089
|
|
|
|
6090
|
|
|
// Named colors |
6091
|
|
|
return colors[ string ]; |
6092
|
|
|
} |
6093
|
|
|
|
6094
|
|
|
color.fn = jQuery.extend( color.prototype, { |
6095
|
|
|
parse: function( red, green, blue, alpha ) { |
6096
|
|
|
if ( red === undefined ) { |
6097
|
|
|
this._rgba = [ null, null, null, null ]; |
6098
|
|
|
return this; |
6099
|
|
|
} |
6100
|
|
|
if ( red.jquery || red.nodeType ) { |
6101
|
|
|
red = jQuery( red ).css( green ); |
6102
|
|
|
green = undefined; |
6103
|
|
|
} |
6104
|
|
|
|
6105
|
|
|
var inst = this, |
6106
|
|
|
type = jQuery.type( red ), |
6107
|
|
|
rgba = this._rgba = []; |
6108
|
|
|
|
6109
|
|
|
// More than 1 argument specified - assume ( red, green, blue, alpha ) |
6110
|
|
|
if ( green !== undefined ) { |
6111
|
|
|
red = [ red, green, blue, alpha ]; |
6112
|
|
|
type = "array"; |
6113
|
|
|
} |
6114
|
|
|
|
6115
|
|
|
if ( type === "string" ) { |
6116
|
|
|
return this.parse( stringParse( red ) || colors._default ); |
6117
|
|
|
} |
6118
|
|
|
|
6119
|
|
|
if ( type === "array" ) { |
6120
|
|
|
each( spaces.rgba.props, function( key, prop ) { |
6121
|
|
|
rgba[ prop.idx ] = clamp( red[ prop.idx ], prop ); |
6122
|
|
|
} ); |
6123
|
|
|
return this; |
6124
|
|
|
} |
6125
|
|
|
|
6126
|
|
|
if ( type === "object" ) { |
|
|
|
|
6127
|
|
|
if ( red instanceof color ) { |
6128
|
|
|
each( spaces, function( spaceName, space ) { |
6129
|
|
|
if ( red[ space.cache ] ) { |
6130
|
|
|
inst[ space.cache ] = red[ space.cache ].slice(); |
6131
|
|
|
} |
6132
|
|
|
} ); |
6133
|
|
|
} else { |
6134
|
|
|
each( spaces, function( spaceName, space ) { |
6135
|
|
|
var cache = space.cache; |
6136
|
|
|
each( space.props, function( key, prop ) { |
6137
|
|
|
|
6138
|
|
|
// If the cache doesn't exist, and we know how to convert |
6139
|
|
|
if ( !inst[ cache ] && space.to ) { |
6140
|
|
|
|
6141
|
|
|
// If the value was null, we don't need to copy it |
6142
|
|
|
// if the key was alpha, we don't need to copy it either |
6143
|
|
|
if ( key === "alpha" || red[ key ] == null ) { |
|
|
|
|
6144
|
|
|
return; |
6145
|
|
|
} |
6146
|
|
|
inst[ cache ] = space.to( inst._rgba ); |
6147
|
|
|
} |
6148
|
|
|
|
6149
|
|
|
// This is the only case where we allow nulls for ALL properties. |
6150
|
|
|
// call clamp with alwaysAllowEmpty |
6151
|
|
|
inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true ); |
6152
|
|
|
} ); |
6153
|
|
|
|
6154
|
|
|
// Everything defined but alpha? |
6155
|
|
|
if ( inst[ cache ] && |
6156
|
|
|
jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) { |
6157
|
|
|
|
6158
|
|
|
// Use the default of 1 |
6159
|
|
|
inst[ cache ][ 3 ] = 1; |
6160
|
|
|
if ( space.from ) { |
6161
|
|
|
inst._rgba = space.from( inst[ cache ] ); |
6162
|
|
|
} |
6163
|
|
|
} |
6164
|
|
|
} ); |
6165
|
|
|
} |
6166
|
|
|
return this; |
6167
|
|
|
} |
6168
|
|
|
}, |
6169
|
|
|
is: function( compare ) { |
6170
|
|
|
var is = color( compare ), |
6171
|
|
|
same = true, |
6172
|
|
|
inst = this; |
6173
|
|
|
|
6174
|
|
|
each( spaces, function( _, space ) { |
6175
|
|
|
var localCache, |
6176
|
|
|
isCache = is[ space.cache ]; |
6177
|
|
|
if ( isCache ) { |
6178
|
|
|
localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || []; |
6179
|
|
|
each( space.props, function( _, prop ) { |
6180
|
|
|
if ( isCache[ prop.idx ] != null ) { |
|
|
|
|
6181
|
|
|
same = ( isCache[ prop.idx ] === localCache[ prop.idx ] ); |
6182
|
|
|
return same; |
6183
|
|
|
} |
6184
|
|
|
} ); |
6185
|
|
|
} |
6186
|
|
|
return same; |
6187
|
|
|
} ); |
6188
|
|
|
return same; |
6189
|
|
|
}, |
6190
|
|
|
_space: function() { |
6191
|
|
|
var used = [], |
6192
|
|
|
inst = this; |
6193
|
|
|
each( spaces, function( spaceName, space ) { |
6194
|
|
|
if ( inst[ space.cache ] ) { |
6195
|
|
|
used.push( spaceName ); |
6196
|
|
|
} |
6197
|
|
|
} ); |
6198
|
|
|
return used.pop(); |
6199
|
|
|
}, |
6200
|
|
|
transition: function( other, distance ) { |
6201
|
|
|
var end = color( other ), |
6202
|
|
|
spaceName = end._space(), |
6203
|
|
|
space = spaces[ spaceName ], |
6204
|
|
|
startColor = this.alpha() === 0 ? color( "transparent" ) : this, |
6205
|
|
|
start = startColor[ space.cache ] || space.to( startColor._rgba ), |
6206
|
|
|
result = start.slice(); |
6207
|
|
|
|
6208
|
|
|
end = end[ space.cache ]; |
6209
|
|
|
each( space.props, function( key, prop ) { |
6210
|
|
|
var index = prop.idx, |
6211
|
|
|
startValue = start[ index ], |
6212
|
|
|
endValue = end[ index ], |
6213
|
|
|
type = propTypes[ prop.type ] || {}; |
6214
|
|
|
|
6215
|
|
|
// If null, don't override start value |
6216
|
|
|
if ( endValue === null ) { |
6217
|
|
|
return; |
6218
|
|
|
} |
6219
|
|
|
|
6220
|
|
|
// If null - use end |
6221
|
|
|
if ( startValue === null ) { |
6222
|
|
|
result[ index ] = endValue; |
6223
|
|
|
} else { |
6224
|
|
|
if ( type.mod ) { |
6225
|
|
|
if ( endValue - startValue > type.mod / 2 ) { |
6226
|
|
|
startValue += type.mod; |
6227
|
|
|
} else if ( startValue - endValue > type.mod / 2 ) { |
6228
|
|
|
startValue -= type.mod; |
6229
|
|
|
} |
6230
|
|
|
} |
6231
|
|
|
result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop ); |
6232
|
|
|
} |
6233
|
|
|
} ); |
6234
|
|
|
return this[ spaceName ]( result ); |
6235
|
|
|
}, |
6236
|
|
|
blend: function( opaque ) { |
6237
|
|
|
|
6238
|
|
|
// If we are already opaque - return ourself |
6239
|
|
|
if ( this._rgba[ 3 ] === 1 ) { |
6240
|
|
|
return this; |
6241
|
|
|
} |
6242
|
|
|
|
6243
|
|
|
var rgb = this._rgba.slice(), |
6244
|
|
|
a = rgb.pop(), |
6245
|
|
|
blend = color( opaque )._rgba; |
6246
|
|
|
|
6247
|
|
|
return color( jQuery.map( rgb, function( v, i ) { |
6248
|
|
|
return ( 1 - a ) * blend[ i ] + a * v; |
6249
|
|
|
} ) ); |
6250
|
|
|
}, |
6251
|
|
|
toRgbaString: function() { |
6252
|
|
|
var prefix = "rgba(", |
6253
|
|
|
rgba = jQuery.map( this._rgba, function( v, i ) { |
6254
|
|
|
return v == null ? ( i > 2 ? 1 : 0 ) : v; |
|
|
|
|
6255
|
|
|
} ); |
6256
|
|
|
|
6257
|
|
|
if ( rgba[ 3 ] === 1 ) { |
6258
|
|
|
rgba.pop(); |
6259
|
|
|
prefix = "rgb("; |
6260
|
|
|
} |
6261
|
|
|
|
6262
|
|
|
return prefix + rgba.join() + ")"; |
6263
|
|
|
}, |
6264
|
|
|
toHslaString: function() { |
6265
|
|
|
var prefix = "hsla(", |
6266
|
|
|
hsla = jQuery.map( this.hsla(), function( v, i ) { |
6267
|
|
|
if ( v == null ) { |
|
|
|
|
6268
|
|
|
v = i > 2 ? 1 : 0; |
6269
|
|
|
} |
6270
|
|
|
|
6271
|
|
|
// Catch 1 and 2 |
6272
|
|
|
if ( i && i < 3 ) { |
6273
|
|
|
v = Math.round( v * 100 ) + "%"; |
6274
|
|
|
} |
6275
|
|
|
return v; |
6276
|
|
|
} ); |
6277
|
|
|
|
6278
|
|
|
if ( hsla[ 3 ] === 1 ) { |
6279
|
|
|
hsla.pop(); |
6280
|
|
|
prefix = "hsl("; |
6281
|
|
|
} |
6282
|
|
|
return prefix + hsla.join() + ")"; |
6283
|
|
|
}, |
6284
|
|
|
toHexString: function( includeAlpha ) { |
6285
|
|
|
var rgba = this._rgba.slice(), |
6286
|
|
|
alpha = rgba.pop(); |
6287
|
|
|
|
6288
|
|
|
if ( includeAlpha ) { |
6289
|
|
|
rgba.push( ~~( alpha * 255 ) ); |
6290
|
|
|
} |
6291
|
|
|
|
6292
|
|
|
return "#" + jQuery.map( rgba, function( v ) { |
6293
|
|
|
|
6294
|
|
|
// Default to 0 when nulls exist |
6295
|
|
|
v = ( v || 0 ).toString( 16 ); |
6296
|
|
|
return v.length === 1 ? "0" + v : v; |
6297
|
|
|
} ).join( "" ); |
6298
|
|
|
}, |
6299
|
|
|
toString: function() { |
6300
|
|
|
return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString(); |
6301
|
|
|
} |
6302
|
|
|
} ); |
6303
|
|
|
color.fn.parse.prototype = color.fn; |
6304
|
|
|
|
6305
|
|
|
// Hsla conversions adapted from: |
6306
|
|
|
// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021 |
6307
|
|
|
|
6308
|
|
|
function hue2rgb( p, q, h ) { |
6309
|
|
|
h = ( h + 1 ) % 1; |
6310
|
|
|
if ( h * 6 < 1 ) { |
6311
|
|
|
return p + ( q - p ) * h * 6; |
6312
|
|
|
} |
6313
|
|
|
if ( h * 2 < 1 ) { |
6314
|
|
|
return q; |
6315
|
|
|
} |
6316
|
|
|
if ( h * 3 < 2 ) { |
6317
|
|
|
return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6; |
6318
|
|
|
} |
6319
|
|
|
return p; |
6320
|
|
|
} |
6321
|
|
|
|
6322
|
|
|
spaces.hsla.to = function( rgba ) { |
6323
|
|
|
if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) { |
|
|
|
|
6324
|
|
|
return [ null, null, null, rgba[ 3 ] ]; |
6325
|
|
|
} |
6326
|
|
|
var r = rgba[ 0 ] / 255, |
6327
|
|
|
g = rgba[ 1 ] / 255, |
6328
|
|
|
b = rgba[ 2 ] / 255, |
6329
|
|
|
a = rgba[ 3 ], |
6330
|
|
|
max = Math.max( r, g, b ), |
6331
|
|
|
min = Math.min( r, g, b ), |
6332
|
|
|
diff = max - min, |
6333
|
|
|
add = max + min, |
6334
|
|
|
l = add * 0.5, |
6335
|
|
|
h, s; |
6336
|
|
|
|
6337
|
|
View Code Duplication |
if ( min === max ) { |
|
|
|
|
6338
|
|
|
h = 0; |
6339
|
|
|
} else if ( r === max ) { |
6340
|
|
|
h = ( 60 * ( g - b ) / diff ) + 360; |
6341
|
|
|
} else if ( g === max ) { |
6342
|
|
|
h = ( 60 * ( b - r ) / diff ) + 120; |
6343
|
|
|
} else { |
6344
|
|
|
h = ( 60 * ( r - g ) / diff ) + 240; |
6345
|
|
|
} |
6346
|
|
|
|
6347
|
|
|
// Chroma (diff) == 0 means greyscale which, by definition, saturation = 0% |
6348
|
|
|
// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add) |
6349
|
|
|
if ( diff === 0 ) { |
6350
|
|
|
s = 0; |
6351
|
|
|
} else if ( l <= 0.5 ) { |
6352
|
|
|
s = diff / add; |
6353
|
|
|
} else { |
6354
|
|
|
s = diff / ( 2 - add ); |
6355
|
|
|
} |
6356
|
|
|
return [ Math.round( h ) % 360, s, l, a == null ? 1 : a ]; |
|
|
|
|
6357
|
|
|
}; |
6358
|
|
|
|
6359
|
|
|
spaces.hsla.from = function( hsla ) { |
6360
|
|
|
if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) { |
|
|
|
|
6361
|
|
|
return [ null, null, null, hsla[ 3 ] ]; |
6362
|
|
|
} |
6363
|
|
|
var h = hsla[ 0 ] / 360, |
6364
|
|
|
s = hsla[ 1 ], |
6365
|
|
|
l = hsla[ 2 ], |
6366
|
|
|
a = hsla[ 3 ], |
6367
|
|
|
q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s, |
6368
|
|
|
p = 2 * l - q; |
6369
|
|
|
|
6370
|
|
|
return [ |
6371
|
|
|
Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ), |
6372
|
|
|
Math.round( hue2rgb( p, q, h ) * 255 ), |
6373
|
|
|
Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ), |
6374
|
|
|
a |
6375
|
|
|
]; |
6376
|
|
|
}; |
6377
|
|
|
|
6378
|
|
|
each( spaces, function( spaceName, space ) { |
6379
|
|
|
var props = space.props, |
6380
|
|
|
cache = space.cache, |
6381
|
|
|
to = space.to, |
6382
|
|
|
from = space.from; |
6383
|
|
|
|
6384
|
|
|
// Makes rgba() and hsla() |
6385
|
|
|
color.fn[ spaceName ] = function( value ) { |
6386
|
|
|
|
6387
|
|
|
// Generate a cache for this space if it doesn't exist |
6388
|
|
|
if ( to && !this[ cache ] ) { |
6389
|
|
|
this[ cache ] = to( this._rgba ); |
6390
|
|
|
} |
6391
|
|
|
if ( value === undefined ) { |
6392
|
|
|
return this[ cache ].slice(); |
6393
|
|
|
} |
6394
|
|
|
|
6395
|
|
|
var ret, |
6396
|
|
|
type = jQuery.type( value ), |
6397
|
|
|
arr = ( type === "array" || type === "object" ) ? value : arguments, |
6398
|
|
|
local = this[ cache ].slice(); |
6399
|
|
|
|
6400
|
|
|
each( props, function( key, prop ) { |
6401
|
|
|
var val = arr[ type === "object" ? key : prop.idx ]; |
6402
|
|
|
if ( val == null ) { |
|
|
|
|
6403
|
|
|
val = local[ prop.idx ]; |
6404
|
|
|
} |
6405
|
|
|
local[ prop.idx ] = clamp( val, prop ); |
6406
|
|
|
} ); |
6407
|
|
|
|
6408
|
|
|
if ( from ) { |
6409
|
|
|
ret = color( from( local ) ); |
6410
|
|
|
ret[ cache ] = local; |
6411
|
|
|
return ret; |
6412
|
|
|
} else { |
|
|
|
|
6413
|
|
|
return color( local ); |
6414
|
|
|
} |
6415
|
|
|
}; |
6416
|
|
|
|
6417
|
|
|
// Makes red() green() blue() alpha() hue() saturation() lightness() |
6418
|
|
|
each( props, function( key, prop ) { |
6419
|
|
|
|
6420
|
|
|
// Alpha is included in more than one space |
6421
|
|
|
if ( color.fn[ key ] ) { |
6422
|
|
|
return; |
6423
|
|
|
} |
6424
|
|
|
color.fn[ key ] = function( value ) { |
6425
|
|
|
var vtype = jQuery.type( value ), |
6426
|
|
|
fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ), |
6427
|
|
|
local = this[ fn ](), |
6428
|
|
|
cur = local[ prop.idx ], |
6429
|
|
|
match; |
6430
|
|
|
|
6431
|
|
|
if ( vtype === "undefined" ) { |
6432
|
|
|
return cur; |
6433
|
|
|
} |
6434
|
|
|
|
6435
|
|
|
if ( vtype === "function" ) { |
6436
|
|
|
value = value.call( this, cur ); |
6437
|
|
|
vtype = jQuery.type( value ); |
6438
|
|
|
} |
6439
|
|
|
if ( value == null && prop.empty ) { |
|
|
|
|
6440
|
|
|
return this; |
6441
|
|
|
} |
6442
|
|
|
if ( vtype === "string" ) { |
6443
|
|
|
match = rplusequals.exec( value ); |
6444
|
|
|
if ( match ) { |
6445
|
|
|
value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 ); |
6446
|
|
|
} |
6447
|
|
|
} |
6448
|
|
|
local[ prop.idx ] = value; |
6449
|
|
|
return this[ fn ]( local ); |
6450
|
|
|
}; |
6451
|
|
|
} ); |
6452
|
|
|
} ); |
6453
|
|
|
|
6454
|
|
|
// Add cssHook and .fx.step function for each named hook. |
6455
|
|
|
// accept a space separated string of properties |
6456
|
|
|
color.hook = function( hook ) { |
6457
|
|
|
var hooks = hook.split( " " ); |
6458
|
|
|
each( hooks, function( i, hook ) { |
6459
|
|
|
jQuery.cssHooks[ hook ] = { |
6460
|
|
|
set: function( elem, value ) { |
6461
|
|
|
var parsed, curElem, |
6462
|
|
|
backgroundColor = ""; |
6463
|
|
|
|
6464
|
|
|
if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || |
6465
|
|
|
( parsed = stringParse( value ) ) ) ) { |
6466
|
|
|
value = color( parsed || value ); |
6467
|
|
|
if ( !support.rgba && value._rgba[ 3 ] !== 1 ) { |
6468
|
|
|
curElem = hook === "backgroundColor" ? elem.parentNode : elem; |
6469
|
|
|
while ( |
6470
|
|
|
( backgroundColor === "" || backgroundColor === "transparent" ) && |
6471
|
|
|
curElem && curElem.style |
6472
|
|
|
) { |
6473
|
|
|
try { |
6474
|
|
|
backgroundColor = jQuery.css( curElem, "backgroundColor" ); |
6475
|
|
|
curElem = curElem.parentNode; |
6476
|
|
|
} catch ( e ) { |
|
|
|
|
6477
|
|
|
} |
6478
|
|
|
} |
6479
|
|
|
|
6480
|
|
|
value = value.blend( backgroundColor && backgroundColor !== "transparent" ? |
6481
|
|
|
backgroundColor : |
6482
|
|
|
"_default" ); |
6483
|
|
|
} |
6484
|
|
|
|
6485
|
|
|
value = value.toRgbaString(); |
6486
|
|
|
} |
6487
|
|
|
try { |
6488
|
|
|
elem.style[ hook ] = value; |
6489
|
|
|
} catch ( e ) { |
|
|
|
|
6490
|
|
|
|
6491
|
|
|
// Wrapped to prevent IE from throwing errors on "invalid" values like |
6492
|
|
|
// 'auto' or 'inherit' |
6493
|
|
|
} |
6494
|
|
|
} |
6495
|
|
|
}; |
6496
|
|
|
jQuery.fx.step[ hook ] = function( fx ) { |
6497
|
|
|
if ( !fx.colorInit ) { |
6498
|
|
|
fx.start = color( fx.elem, hook ); |
6499
|
|
|
fx.end = color( fx.end ); |
6500
|
|
|
fx.colorInit = true; |
6501
|
|
|
} |
6502
|
|
|
jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) ); |
6503
|
|
|
}; |
6504
|
|
|
} ); |
6505
|
|
|
|
6506
|
|
|
}; |
6507
|
|
|
|
6508
|
|
|
color.hook( stepHooks ); |
6509
|
|
|
|
6510
|
|
|
jQuery.cssHooks.borderColor = { |
6511
|
|
|
expand: function( value ) { |
6512
|
|
|
var expanded = {}; |
6513
|
|
|
|
6514
|
|
|
each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) { |
6515
|
|
|
expanded[ "border" + part + "Color" ] = value; |
6516
|
|
|
} ); |
6517
|
|
|
return expanded; |
6518
|
|
|
} |
6519
|
|
|
}; |
6520
|
|
|
|
6521
|
|
|
// Basic color names only. |
6522
|
|
|
// Usage of any of the other color names requires adding yourself or including |
6523
|
|
|
// jquery.color.svg-names.js. |
6524
|
|
|
colors = jQuery.Color.names = { |
6525
|
|
|
|
6526
|
|
|
// 4.1. Basic color keywords |
6527
|
|
|
aqua: "#00ffff", |
6528
|
|
|
black: "#000000", |
6529
|
|
|
blue: "#0000ff", |
6530
|
|
|
fuchsia: "#ff00ff", |
6531
|
|
|
gray: "#808080", |
6532
|
|
|
green: "#008000", |
6533
|
|
|
lime: "#00ff00", |
6534
|
|
|
maroon: "#800000", |
6535
|
|
|
navy: "#000080", |
6536
|
|
|
olive: "#808000", |
6537
|
|
|
purple: "#800080", |
6538
|
|
|
red: "#ff0000", |
6539
|
|
|
silver: "#c0c0c0", |
6540
|
|
|
teal: "#008080", |
6541
|
|
|
white: "#ffffff", |
6542
|
|
|
yellow: "#ffff00", |
6543
|
|
|
|
6544
|
|
|
// 4.2.3. "transparent" color keyword |
6545
|
|
|
transparent: [ null, null, null, 0 ], |
6546
|
|
|
|
6547
|
|
|
_default: "#ffffff" |
6548
|
|
|
}; |
6549
|
|
|
|
6550
|
|
|
} )( jQuery ); |
6551
|
|
|
|
6552
|
|
|
/******************************************************************************/ |
6553
|
|
|
/****************************** CLASS ANIMATIONS ******************************/ |
6554
|
|
|
/******************************************************************************/ |
6555
|
|
|
( function() { |
6556
|
|
|
|
6557
|
|
|
var classAnimationActions = [ "add", "remove", "toggle" ], |
6558
|
|
|
shorthandStyles = { |
6559
|
|
|
border: 1, |
6560
|
|
|
borderBottom: 1, |
6561
|
|
|
borderColor: 1, |
6562
|
|
|
borderLeft: 1, |
6563
|
|
|
borderRight: 1, |
6564
|
|
|
borderTop: 1, |
6565
|
|
|
borderWidth: 1, |
6566
|
|
|
margin: 1, |
6567
|
|
|
padding: 1 |
6568
|
|
|
}; |
6569
|
|
|
|
6570
|
|
|
$.each( |
6571
|
|
|
[ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], |
6572
|
|
|
function( _, prop ) { |
6573
|
|
|
$.fx.step[ prop ] = function( fx ) { |
6574
|
|
|
if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) { |
6575
|
|
|
jQuery.style( fx.elem, prop, fx.end ); |
6576
|
|
|
fx.setAttr = true; |
6577
|
|
|
} |
6578
|
|
|
}; |
6579
|
|
|
} |
6580
|
|
|
); |
6581
|
|
|
|
6582
|
|
|
function getElementStyles( elem ) { |
6583
|
|
|
var key, len, |
6584
|
|
|
style = elem.ownerDocument.defaultView ? |
6585
|
|
|
elem.ownerDocument.defaultView.getComputedStyle( elem, null ) : |
6586
|
|
|
elem.currentStyle, |
6587
|
|
|
styles = {}; |
6588
|
|
|
|
6589
|
|
|
if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) { |
6590
|
|
|
len = style.length; |
6591
|
|
|
while ( len-- ) { |
6592
|
|
|
key = style[ len ]; |
6593
|
|
|
if ( typeof style[ key ] === "string" ) { |
6594
|
|
|
styles[ $.camelCase( key ) ] = style[ key ]; |
6595
|
|
|
} |
6596
|
|
|
} |
6597
|
|
|
|
6598
|
|
|
// Support: Opera, IE <9 |
6599
|
|
|
} else { |
6600
|
|
|
for ( key in style ) { |
6601
|
|
|
if ( typeof style[ key ] === "string" ) { |
6602
|
|
|
styles[ key ] = style[ key ]; |
6603
|
|
|
} |
6604
|
|
|
} |
6605
|
|
|
} |
6606
|
|
|
|
6607
|
|
|
return styles; |
6608
|
|
|
} |
6609
|
|
|
|
6610
|
|
|
function styleDifference( oldStyle, newStyle ) { |
6611
|
|
|
var diff = {}, |
6612
|
|
|
name, value; |
6613
|
|
|
|
6614
|
|
|
for ( name in newStyle ) { |
6615
|
|
|
value = newStyle[ name ]; |
6616
|
|
|
if ( oldStyle[ name ] !== value ) { |
6617
|
|
|
if ( !shorthandStyles[ name ] ) { |
6618
|
|
|
if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) { |
6619
|
|
|
diff[ name ] = value; |
6620
|
|
|
} |
6621
|
|
|
} |
6622
|
|
|
} |
6623
|
|
|
} |
6624
|
|
|
|
6625
|
|
|
return diff; |
6626
|
|
|
} |
6627
|
|
|
|
6628
|
|
|
// Support: jQuery <1.8 |
6629
|
|
|
if ( !$.fn.addBack ) { |
6630
|
|
|
$.fn.addBack = function( selector ) { |
6631
|
|
|
return this.add( selector == null ? |
|
|
|
|
6632
|
|
|
this.prevObject : this.prevObject.filter( selector ) |
6633
|
|
|
); |
6634
|
|
|
}; |
6635
|
|
|
} |
6636
|
|
|
|
6637
|
|
|
$.effects.animateClass = function( value, duration, easing, callback ) { |
6638
|
|
|
var o = $.speed( duration, easing, callback ); |
6639
|
|
|
|
6640
|
|
|
return this.queue( function() { |
6641
|
|
|
var animated = $( this ), |
6642
|
|
|
baseClass = animated.attr( "class" ) || "", |
6643
|
|
|
applyClassChange, |
6644
|
|
|
allAnimations = o.children ? animated.find( "*" ).addBack() : animated; |
6645
|
|
|
|
6646
|
|
|
// Map the animated objects to store the original styles. |
6647
|
|
|
allAnimations = allAnimations.map( function() { |
6648
|
|
|
var el = $( this ); |
6649
|
|
|
return { |
6650
|
|
|
el: el, |
6651
|
|
|
start: getElementStyles( this ) |
6652
|
|
|
}; |
6653
|
|
|
} ); |
6654
|
|
|
|
6655
|
|
|
// Apply class change |
6656
|
|
|
applyClassChange = function() { |
6657
|
|
|
$.each( classAnimationActions, function( i, action ) { |
6658
|
|
|
if ( value[ action ] ) { |
6659
|
|
|
animated[ action + "Class" ]( value[ action ] ); |
6660
|
|
|
} |
6661
|
|
|
} ); |
6662
|
|
|
}; |
6663
|
|
|
applyClassChange(); |
6664
|
|
|
|
6665
|
|
|
// Map all animated objects again - calculate new styles and diff |
6666
|
|
|
allAnimations = allAnimations.map( function() { |
6667
|
|
|
this.end = getElementStyles( this.el[ 0 ] ); |
6668
|
|
|
this.diff = styleDifference( this.start, this.end ); |
6669
|
|
|
return this; |
6670
|
|
|
} ); |
6671
|
|
|
|
6672
|
|
|
// Apply original class |
6673
|
|
|
animated.attr( "class", baseClass ); |
6674
|
|
|
|
6675
|
|
|
// Map all animated objects again - this time collecting a promise |
6676
|
|
|
allAnimations = allAnimations.map( function() { |
6677
|
|
|
var styleInfo = this, |
6678
|
|
|
dfd = $.Deferred(), |
6679
|
|
|
opts = $.extend( {}, o, { |
6680
|
|
|
queue: false, |
6681
|
|
|
complete: function() { |
6682
|
|
|
dfd.resolve( styleInfo ); |
6683
|
|
|
} |
6684
|
|
|
} ); |
6685
|
|
|
|
6686
|
|
|
this.el.animate( this.diff, opts ); |
6687
|
|
|
return dfd.promise(); |
6688
|
|
|
} ); |
6689
|
|
|
|
6690
|
|
|
// Once all animations have completed: |
6691
|
|
|
$.when.apply( $, allAnimations.get() ).done( function() { |
6692
|
|
|
|
6693
|
|
|
// Set the final class |
6694
|
|
|
applyClassChange(); |
6695
|
|
|
|
6696
|
|
|
// For each animated element, |
6697
|
|
|
// clear all css properties that were animated |
6698
|
|
|
$.each( arguments, function() { |
6699
|
|
|
var el = this.el; |
6700
|
|
|
$.each( this.diff, function( key ) { |
6701
|
|
|
el.css( key, "" ); |
6702
|
|
|
} ); |
6703
|
|
|
} ); |
6704
|
|
|
|
6705
|
|
|
// This is guarnteed to be there if you use jQuery.speed() |
6706
|
|
|
// it also handles dequeuing the next anim... |
6707
|
|
|
o.complete.call( animated[ 0 ] ); |
6708
|
|
|
} ); |
6709
|
|
|
} ); |
6710
|
|
|
}; |
6711
|
|
|
|
6712
|
|
|
$.fn.extend( { |
6713
|
|
|
addClass: ( function( orig ) { |
6714
|
|
|
return function( classNames, speed, easing, callback ) { |
6715
|
|
|
return speed ? |
6716
|
|
|
$.effects.animateClass.call( this, |
6717
|
|
|
{ add: classNames }, speed, easing, callback ) : |
6718
|
|
|
orig.apply( this, arguments ); |
6719
|
|
|
}; |
6720
|
|
|
} )( $.fn.addClass ), |
6721
|
|
|
|
6722
|
|
|
removeClass: ( function( orig ) { |
6723
|
|
|
return function( classNames, speed, easing, callback ) { |
6724
|
|
|
return arguments.length > 1 ? |
6725
|
|
|
$.effects.animateClass.call( this, |
6726
|
|
|
{ remove: classNames }, speed, easing, callback ) : |
6727
|
|
|
orig.apply( this, arguments ); |
6728
|
|
|
}; |
6729
|
|
|
} )( $.fn.removeClass ), |
6730
|
|
|
|
6731
|
|
|
toggleClass: ( function( orig ) { |
6732
|
|
|
return function( classNames, force, speed, easing, callback ) { |
6733
|
|
|
if ( typeof force === "boolean" || force === undefined ) { |
6734
|
|
|
if ( !speed ) { |
6735
|
|
|
|
6736
|
|
|
// Without speed parameter |
6737
|
|
|
return orig.apply( this, arguments ); |
6738
|
|
|
} else { |
|
|
|
|
6739
|
|
|
return $.effects.animateClass.call( this, |
6740
|
|
|
( force ? { add: classNames } : { remove: classNames } ), |
6741
|
|
|
speed, easing, callback ); |
6742
|
|
|
} |
6743
|
|
|
} else { |
|
|
|
|
6744
|
|
|
|
6745
|
|
|
// Without force parameter |
6746
|
|
|
return $.effects.animateClass.call( this, |
6747
|
|
|
{ toggle: classNames }, force, speed, easing ); |
6748
|
|
|
} |
6749
|
|
|
}; |
6750
|
|
|
} )( $.fn.toggleClass ), |
6751
|
|
|
|
6752
|
|
|
switchClass: function( remove, add, speed, easing, callback ) { |
6753
|
|
|
return $.effects.animateClass.call( this, { |
6754
|
|
|
add: add, |
6755
|
|
|
remove: remove |
6756
|
|
|
}, speed, easing, callback ); |
6757
|
|
|
} |
6758
|
|
|
} ); |
6759
|
|
|
|
6760
|
|
|
} )(); |
6761
|
|
|
|
6762
|
|
|
/******************************************************************************/ |
6763
|
|
|
/*********************************** EFFECTS **********************************/ |
6764
|
|
|
/******************************************************************************/ |
6765
|
|
|
|
6766
|
|
|
( function() { |
6767
|
|
|
|
6768
|
|
|
if ( $.expr && $.expr.filters && $.expr.filters.animated ) { |
6769
|
|
|
$.expr.filters.animated = ( function( orig ) { |
6770
|
|
|
return function( elem ) { |
6771
|
|
|
return !!$( elem ).data( dataSpaceAnimated ) || orig( elem ); |
6772
|
|
|
}; |
6773
|
|
|
} )( $.expr.filters.animated ); |
6774
|
|
|
} |
6775
|
|
|
|
6776
|
|
|
if ( $.uiBackCompat !== false ) { |
6777
|
|
|
$.extend( $.effects, { |
6778
|
|
|
|
6779
|
|
|
// Saves a set of properties in a data storage |
6780
|
|
|
save: function( element, set ) { |
6781
|
|
|
var i = 0, length = set.length; |
6782
|
|
|
for ( ; i < length; i++ ) { |
6783
|
|
|
if ( set[ i ] !== null ) { |
6784
|
|
|
element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] ); |
6785
|
|
|
} |
6786
|
|
|
} |
6787
|
|
|
}, |
6788
|
|
|
|
6789
|
|
|
// Restores a set of previously saved properties from a data storage |
6790
|
|
|
restore: function( element, set ) { |
6791
|
|
|
var val, i = 0, length = set.length; |
6792
|
|
|
for ( ; i < length; i++ ) { |
6793
|
|
|
if ( set[ i ] !== null ) { |
6794
|
|
|
val = element.data( dataSpace + set[ i ] ); |
6795
|
|
|
element.css( set[ i ], val ); |
6796
|
|
|
} |
6797
|
|
|
} |
6798
|
|
|
}, |
6799
|
|
|
|
6800
|
|
|
setMode: function( el, mode ) { |
6801
|
|
|
if ( mode === "toggle" ) { |
6802
|
|
|
mode = el.is( ":hidden" ) ? "show" : "hide"; |
6803
|
|
|
} |
6804
|
|
|
return mode; |
6805
|
|
|
}, |
6806
|
|
|
|
6807
|
|
|
// Wraps the element around a wrapper that copies position properties |
6808
|
|
|
createWrapper: function( element ) { |
6809
|
|
|
|
6810
|
|
|
// If the element is already wrapped, return it |
6811
|
|
|
if ( element.parent().is( ".ui-effects-wrapper" ) ) { |
6812
|
|
|
return element.parent(); |
6813
|
|
|
} |
6814
|
|
|
|
6815
|
|
|
// Wrap the element |
6816
|
|
|
var props = { |
6817
|
|
|
width: element.outerWidth( true ), |
6818
|
|
|
height: element.outerHeight( true ), |
6819
|
|
|
"float": element.css( "float" ) |
6820
|
|
|
}, |
6821
|
|
|
wrapper = $( "<div></div>" ) |
6822
|
|
|
.addClass( "ui-effects-wrapper" ) |
6823
|
|
|
.css( { |
6824
|
|
|
fontSize: "100%", |
6825
|
|
|
background: "transparent", |
6826
|
|
|
border: "none", |
6827
|
|
|
margin: 0, |
6828
|
|
|
padding: 0 |
6829
|
|
|
} ), |
6830
|
|
|
|
6831
|
|
|
// Store the size in case width/height are defined in % - Fixes #5245 |
6832
|
|
|
size = { |
6833
|
|
|
width: element.width(), |
6834
|
|
|
height: element.height() |
6835
|
|
|
}, |
6836
|
|
|
active = document.activeElement; |
6837
|
|
|
|
6838
|
|
|
// Support: Firefox |
6839
|
|
|
// Firefox incorrectly exposes anonymous content |
6840
|
|
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=561664 |
6841
|
|
|
try { |
6842
|
|
|
active.id; |
|
|
|
|
6843
|
|
|
} catch ( e ) { |
6844
|
|
|
active = document.body; |
6845
|
|
|
} |
6846
|
|
|
|
6847
|
|
|
element.wrap( wrapper ); |
6848
|
|
|
|
6849
|
|
|
// Fixes #7595 - Elements lose focus when wrapped. |
6850
|
|
|
if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { |
6851
|
|
|
$( active ).trigger( "focus" ); |
6852
|
|
|
} |
6853
|
|
|
|
6854
|
|
|
// Hotfix for jQuery 1.4 since some change in wrap() seems to actually |
6855
|
|
|
// lose the reference to the wrapped element |
6856
|
|
|
wrapper = element.parent(); |
6857
|
|
|
|
6858
|
|
|
// Transfer positioning properties to the wrapper |
6859
|
|
|
if ( element.css( "position" ) === "static" ) { |
6860
|
|
|
wrapper.css( { position: "relative" } ); |
6861
|
|
|
element.css( { position: "relative" } ); |
6862
|
|
|
} else { |
6863
|
|
|
$.extend( props, { |
6864
|
|
|
position: element.css( "position" ), |
6865
|
|
|
zIndex: element.css( "z-index" ) |
6866
|
|
|
} ); |
6867
|
|
|
$.each( [ "top", "left", "bottom", "right" ], function( i, pos ) { |
6868
|
|
|
props[ pos ] = element.css( pos ); |
6869
|
|
|
if ( isNaN( parseInt( props[ pos ], 10 ) ) ) { |
6870
|
|
|
props[ pos ] = "auto"; |
6871
|
|
|
} |
6872
|
|
|
} ); |
6873
|
|
|
element.css( { |
6874
|
|
|
position: "relative", |
6875
|
|
|
top: 0, |
6876
|
|
|
left: 0, |
6877
|
|
|
right: "auto", |
6878
|
|
|
bottom: "auto" |
6879
|
|
|
} ); |
6880
|
|
|
} |
6881
|
|
|
element.css( size ); |
6882
|
|
|
|
6883
|
|
|
return wrapper.css( props ).show(); |
6884
|
|
|
}, |
6885
|
|
|
|
6886
|
|
|
removeWrapper: function( element ) { |
6887
|
|
|
var active = document.activeElement; |
6888
|
|
|
|
6889
|
|
|
if ( element.parent().is( ".ui-effects-wrapper" ) ) { |
6890
|
|
|
element.parent().replaceWith( element ); |
6891
|
|
|
|
6892
|
|
|
// Fixes #7595 - Elements lose focus when wrapped. |
6893
|
|
|
if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { |
6894
|
|
|
$( active ).trigger( "focus" ); |
6895
|
|
|
} |
6896
|
|
|
} |
6897
|
|
|
|
6898
|
|
|
return element; |
6899
|
|
|
} |
6900
|
|
|
} ); |
6901
|
|
|
} |
6902
|
|
|
|
6903
|
|
|
$.extend( $.effects, { |
6904
|
|
|
version: "1.12.0", |
6905
|
|
|
|
6906
|
|
|
define: function( name, mode, effect ) { |
6907
|
|
|
if ( !effect ) { |
6908
|
|
|
effect = mode; |
6909
|
|
|
mode = "effect"; |
6910
|
|
|
} |
6911
|
|
|
|
6912
|
|
|
$.effects.effect[ name ] = effect; |
6913
|
|
|
$.effects.effect[ name ].mode = mode; |
6914
|
|
|
|
6915
|
|
|
return effect; |
6916
|
|
|
}, |
6917
|
|
|
|
6918
|
|
|
scaledDimensions: function( element, percent, direction ) { |
6919
|
|
|
if ( percent === 0 ) { |
6920
|
|
|
return { |
6921
|
|
|
height: 0, |
6922
|
|
|
width: 0, |
6923
|
|
|
outerHeight: 0, |
6924
|
|
|
outerWidth: 0 |
6925
|
|
|
}; |
6926
|
|
|
} |
6927
|
|
|
|
6928
|
|
|
var x = direction !== "horizontal" ? ( ( percent || 100 ) / 100 ) : 1, |
6929
|
|
|
y = direction !== "vertical" ? ( ( percent || 100 ) / 100 ) : 1; |
6930
|
|
|
|
6931
|
|
|
return { |
6932
|
|
|
height: element.height() * y, |
6933
|
|
|
width: element.width() * x, |
6934
|
|
|
outerHeight: element.outerHeight() * y, |
6935
|
|
|
outerWidth: element.outerWidth() * x |
6936
|
|
|
}; |
6937
|
|
|
|
6938
|
|
|
}, |
6939
|
|
|
|
6940
|
|
|
clipToBox: function( animation ) { |
6941
|
|
|
return { |
6942
|
|
|
width: animation.clip.right - animation.clip.left, |
6943
|
|
|
height: animation.clip.bottom - animation.clip.top, |
6944
|
|
|
left: animation.clip.left, |
6945
|
|
|
top: animation.clip.top |
6946
|
|
|
}; |
6947
|
|
|
}, |
6948
|
|
|
|
6949
|
|
|
// Injects recently queued functions to be first in line (after "inprogress") |
6950
|
|
|
unshift: function( element, queueLength, count ) { |
6951
|
|
|
var queue = element.queue(); |
6952
|
|
|
|
6953
|
|
|
if ( queueLength > 1 ) { |
6954
|
|
|
queue.splice.apply( queue, |
6955
|
|
|
[ 1, 0 ].concat( queue.splice( queueLength, count ) ) ); |
6956
|
|
|
} |
6957
|
|
|
element.dequeue(); |
6958
|
|
|
}, |
6959
|
|
|
|
6960
|
|
|
saveStyle: function( element ) { |
6961
|
|
|
element.data( dataSpaceStyle, element[ 0 ].style.cssText ); |
6962
|
|
|
}, |
6963
|
|
|
|
6964
|
|
|
restoreStyle: function( element ) { |
6965
|
|
|
element[ 0 ].style.cssText = element.data( dataSpaceStyle ) || ""; |
6966
|
|
|
element.removeData( dataSpaceStyle ); |
6967
|
|
|
}, |
6968
|
|
|
|
6969
|
|
|
mode: function( element, mode ) { |
6970
|
|
|
var hidden = element.is( ":hidden" ); |
6971
|
|
|
|
6972
|
|
|
if ( mode === "toggle" ) { |
6973
|
|
|
mode = hidden ? "show" : "hide"; |
6974
|
|
|
} |
6975
|
|
|
if ( hidden ? mode === "hide" : mode === "show" ) { |
6976
|
|
|
mode = "none"; |
6977
|
|
|
} |
6978
|
|
|
return mode; |
6979
|
|
|
}, |
6980
|
|
|
|
6981
|
|
|
// Translates a [top,left] array into a baseline value |
6982
|
|
|
getBaseline: function( origin, original ) { |
6983
|
|
|
var y, x; |
6984
|
|
|
|
6985
|
|
|
switch ( origin[ 0 ] ) { |
6986
|
|
|
case "top": |
6987
|
|
|
y = 0; |
6988
|
|
|
break; |
6989
|
|
|
case "middle": |
6990
|
|
|
y = 0.5; |
6991
|
|
|
break; |
6992
|
|
|
case "bottom": |
6993
|
|
|
y = 1; |
6994
|
|
|
break; |
6995
|
|
|
default: |
6996
|
|
|
y = origin[ 0 ] / original.height; |
6997
|
|
|
} |
6998
|
|
|
|
6999
|
|
|
switch ( origin[ 1 ] ) { |
7000
|
|
|
case "left": |
7001
|
|
|
x = 0; |
7002
|
|
|
break; |
7003
|
|
|
case "center": |
7004
|
|
|
x = 0.5; |
7005
|
|
|
break; |
7006
|
|
|
case "right": |
7007
|
|
|
x = 1; |
7008
|
|
|
break; |
7009
|
|
|
default: |
7010
|
|
|
x = origin[ 1 ] / original.width; |
7011
|
|
|
} |
7012
|
|
|
|
7013
|
|
|
return { |
7014
|
|
|
x: x, |
7015
|
|
|
y: y |
7016
|
|
|
}; |
7017
|
|
|
}, |
7018
|
|
|
|
7019
|
|
|
// Creates a placeholder element so that the original element can be made absolute |
7020
|
|
|
createPlaceholder: function( element ) { |
7021
|
|
|
var placeholder, |
7022
|
|
|
cssPosition = element.css( "position" ), |
7023
|
|
|
position = element.position(); |
7024
|
|
|
|
7025
|
|
|
// Lock in margins first to account for form elements, which |
7026
|
|
|
// will change margin if you explicitly set height |
7027
|
|
|
// see: http://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380 |
7028
|
|
|
// Support: Safari |
7029
|
|
|
element.css( { |
7030
|
|
|
marginTop: element.css( "marginTop" ), |
7031
|
|
|
marginBottom: element.css( "marginBottom" ), |
7032
|
|
|
marginLeft: element.css( "marginLeft" ), |
7033
|
|
|
marginRight: element.css( "marginRight" ) |
7034
|
|
|
} ) |
7035
|
|
|
.outerWidth( element.outerWidth() ) |
7036
|
|
|
.outerHeight( element.outerHeight() ); |
7037
|
|
|
|
7038
|
|
|
if ( /^(static|relative)/.test( cssPosition ) ) { |
7039
|
|
|
cssPosition = "absolute"; |
7040
|
|
|
|
7041
|
|
|
placeholder = $( "<" + element[ 0 ].nodeName + ">" ).insertAfter( element ).css( { |
7042
|
|
|
|
7043
|
|
|
// Convert inline to inline block to account for inline elements |
7044
|
|
|
// that turn to inline block based on content (like img) |
7045
|
|
|
display: /^(inline|ruby)/.test( element.css( "display" ) ) ? |
7046
|
|
|
"inline-block" : |
7047
|
|
|
"block", |
7048
|
|
|
visibility: "hidden", |
7049
|
|
|
|
7050
|
|
|
// Margins need to be set to account for margin collapse |
7051
|
|
|
marginTop: element.css( "marginTop" ), |
7052
|
|
|
marginBottom: element.css( "marginBottom" ), |
7053
|
|
|
marginLeft: element.css( "marginLeft" ), |
7054
|
|
|
marginRight: element.css( "marginRight" ), |
7055
|
|
|
"float": element.css( "float" ) |
7056
|
|
|
} ) |
7057
|
|
|
.outerWidth( element.outerWidth() ) |
7058
|
|
|
.outerHeight( element.outerHeight() ) |
7059
|
|
|
.addClass( "ui-effects-placeholder" ); |
7060
|
|
|
|
7061
|
|
|
element.data( dataSpace + "placeholder", placeholder ); |
7062
|
|
|
} |
7063
|
|
|
|
7064
|
|
|
element.css( { |
7065
|
|
|
position: cssPosition, |
7066
|
|
|
left: position.left, |
7067
|
|
|
top: position.top |
7068
|
|
|
} ); |
7069
|
|
|
|
7070
|
|
|
return placeholder; |
|
|
|
|
7071
|
|
|
}, |
7072
|
|
|
|
7073
|
|
|
removePlaceholder: function( element ) { |
7074
|
|
|
var dataKey = dataSpace + "placeholder", |
7075
|
|
|
placeholder = element.data( dataKey ); |
7076
|
|
|
|
7077
|
|
|
if ( placeholder ) { |
7078
|
|
|
placeholder.remove(); |
7079
|
|
|
element.removeData( dataKey ); |
7080
|
|
|
} |
7081
|
|
|
}, |
7082
|
|
|
|
7083
|
|
|
// Removes a placeholder if it exists and restores |
7084
|
|
|
// properties that were modified during placeholder creation |
7085
|
|
|
cleanUp: function( element ) { |
7086
|
|
|
$.effects.restoreStyle( element ); |
7087
|
|
|
$.effects.removePlaceholder( element ); |
7088
|
|
|
}, |
7089
|
|
|
|
7090
|
|
|
setTransition: function( element, list, factor, value ) { |
7091
|
|
|
value = value || {}; |
7092
|
|
|
$.each( list, function( i, x ) { |
7093
|
|
|
var unit = element.cssUnit( x ); |
7094
|
|
|
if ( unit[ 0 ] > 0 ) { |
7095
|
|
|
value[ x ] = unit[ 0 ] * factor + unit[ 1 ]; |
7096
|
|
|
} |
7097
|
|
|
} ); |
7098
|
|
|
return value; |
7099
|
|
|
} |
7100
|
|
|
} ); |
7101
|
|
|
|
7102
|
|
|
// Return an effect options object for the given parameters: |
7103
|
|
|
function _normalizeArguments( effect, options, speed, callback ) { |
7104
|
|
|
|
7105
|
|
|
// Allow passing all options as the first parameter |
7106
|
|
|
if ( $.isPlainObject( effect ) ) { |
7107
|
|
|
options = effect; |
7108
|
|
|
effect = effect.effect; |
7109
|
|
|
} |
7110
|
|
|
|
7111
|
|
|
// Convert to an object |
7112
|
|
|
effect = { effect: effect }; |
7113
|
|
|
|
7114
|
|
|
// Catch (effect, null, ...) |
7115
|
|
|
if ( options == null ) { |
|
|
|
|
7116
|
|
|
options = {}; |
7117
|
|
|
} |
7118
|
|
|
|
7119
|
|
|
// Catch (effect, callback) |
7120
|
|
|
if ( $.isFunction( options ) ) { |
7121
|
|
|
callback = options; |
7122
|
|
|
speed = null; |
7123
|
|
|
options = {}; |
7124
|
|
|
} |
7125
|
|
|
|
7126
|
|
|
// Catch (effect, speed, ?) |
7127
|
|
|
if ( typeof options === "number" || $.fx.speeds[ options ] ) { |
7128
|
|
|
callback = speed; |
7129
|
|
|
speed = options; |
7130
|
|
|
options = {}; |
7131
|
|
|
} |
7132
|
|
|
|
7133
|
|
|
// Catch (effect, options, callback) |
7134
|
|
|
if ( $.isFunction( speed ) ) { |
7135
|
|
|
callback = speed; |
7136
|
|
|
speed = null; |
7137
|
|
|
} |
7138
|
|
|
|
7139
|
|
|
// Add options to effect |
7140
|
|
|
if ( options ) { |
7141
|
|
|
$.extend( effect, options ); |
7142
|
|
|
} |
7143
|
|
|
|
7144
|
|
|
speed = speed || options.duration; |
7145
|
|
|
effect.duration = $.fx.off ? 0 : |
7146
|
|
|
typeof speed === "number" ? speed : |
7147
|
|
|
speed in $.fx.speeds ? $.fx.speeds[ speed ] : |
7148
|
|
|
$.fx.speeds._default; |
7149
|
|
|
|
7150
|
|
|
effect.complete = callback || options.complete; |
7151
|
|
|
|
7152
|
|
|
return effect; |
7153
|
|
|
} |
7154
|
|
|
|
7155
|
|
|
function standardAnimationOption( option ) { |
7156
|
|
|
|
7157
|
|
|
// Valid standard speeds (nothing, number, named speed) |
7158
|
|
|
if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) { |
7159
|
|
|
return true; |
7160
|
|
|
} |
7161
|
|
|
|
7162
|
|
|
// Invalid strings - treat as "normal" speed |
7163
|
|
|
if ( typeof option === "string" && !$.effects.effect[ option ] ) { |
7164
|
|
|
return true; |
7165
|
|
|
} |
7166
|
|
|
|
7167
|
|
|
// Complete callback |
7168
|
|
|
if ( $.isFunction( option ) ) { |
7169
|
|
|
return true; |
7170
|
|
|
} |
7171
|
|
|
|
7172
|
|
|
// Options hash (but not naming an effect) |
7173
|
|
|
if ( typeof option === "object" && !option.effect ) { |
7174
|
|
|
return true; |
7175
|
|
|
} |
7176
|
|
|
|
7177
|
|
|
// Didn't match any standard API |
7178
|
|
|
return false; |
7179
|
|
|
} |
7180
|
|
|
|
7181
|
|
|
$.fn.extend( { |
7182
|
|
|
effect: function( /* effect, options, speed, callback */ ) { |
7183
|
|
|
var args = _normalizeArguments.apply( this, arguments ), |
7184
|
|
|
effectMethod = $.effects.effect[ args.effect ], |
7185
|
|
|
defaultMode = effectMethod.mode, |
7186
|
|
|
queue = args.queue, |
7187
|
|
|
queueName = queue || "fx", |
7188
|
|
|
complete = args.complete, |
7189
|
|
|
mode = args.mode, |
7190
|
|
|
modes = [], |
7191
|
|
|
prefilter = function( next ) { |
7192
|
|
|
var el = $( this ), |
7193
|
|
|
normalizedMode = $.effects.mode( el, mode ) || defaultMode; |
7194
|
|
|
|
7195
|
|
|
// Sentinel for duck-punching the :animated psuedo-selector |
7196
|
|
|
el.data( dataSpaceAnimated, true ); |
7197
|
|
|
|
7198
|
|
|
// Save effect mode for later use, |
7199
|
|
|
// we can't just call $.effects.mode again later, |
7200
|
|
|
// as the .show() below destroys the initial state |
7201
|
|
|
modes.push( normalizedMode ); |
7202
|
|
|
|
7203
|
|
|
// See $.uiBackCompat inside of run() for removal of defaultMode in 1.13 |
7204
|
|
|
if ( defaultMode && ( normalizedMode === "show" || |
7205
|
|
|
( normalizedMode === defaultMode && normalizedMode === "hide" ) ) ) { |
7206
|
|
|
el.show(); |
7207
|
|
|
} |
7208
|
|
|
|
7209
|
|
|
if ( !defaultMode || normalizedMode !== "none" ) { |
7210
|
|
|
$.effects.saveStyle( el ); |
7211
|
|
|
} |
7212
|
|
|
|
7213
|
|
|
if ( $.isFunction( next ) ) { |
7214
|
|
|
next(); |
7215
|
|
|
} |
7216
|
|
|
}; |
7217
|
|
|
|
7218
|
|
|
if ( $.fx.off || !effectMethod ) { |
7219
|
|
|
|
7220
|
|
|
// Delegate to the original method (e.g., .show()) if possible |
7221
|
|
|
if ( mode ) { |
7222
|
|
|
return this[ mode ]( args.duration, complete ); |
7223
|
|
|
} else { |
|
|
|
|
7224
|
|
|
return this.each( function() { |
7225
|
|
|
if ( complete ) { |
7226
|
|
|
complete.call( this ); |
7227
|
|
|
} |
7228
|
|
|
} ); |
7229
|
|
|
} |
7230
|
|
|
} |
7231
|
|
|
|
7232
|
|
|
function run( next ) { |
7233
|
|
|
var elem = $( this ); |
7234
|
|
|
|
7235
|
|
|
function cleanup() { |
7236
|
|
|
elem.removeData( dataSpaceAnimated ); |
7237
|
|
|
|
7238
|
|
|
$.effects.cleanUp( elem ); |
7239
|
|
|
|
7240
|
|
|
if ( args.mode === "hide" ) { |
7241
|
|
|
elem.hide(); |
7242
|
|
|
} |
7243
|
|
|
|
7244
|
|
|
done(); |
7245
|
|
|
} |
7246
|
|
|
|
7247
|
|
|
function done() { |
7248
|
|
|
if ( $.isFunction( complete ) ) { |
7249
|
|
|
complete.call( elem[ 0 ] ); |
7250
|
|
|
} |
7251
|
|
|
|
7252
|
|
|
if ( $.isFunction( next ) ) { |
7253
|
|
|
next(); |
7254
|
|
|
} |
7255
|
|
|
} |
7256
|
|
|
|
7257
|
|
|
// Override mode option on a per element basis, |
7258
|
|
|
// as toggle can be either show or hide depending on element state |
7259
|
|
|
args.mode = modes.shift(); |
7260
|
|
|
|
7261
|
|
|
if ( $.uiBackCompat !== false && !defaultMode ) { |
7262
|
|
|
if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) { |
7263
|
|
|
|
7264
|
|
|
// Call the core method to track "olddisplay" properly |
7265
|
|
|
elem[ mode ](); |
7266
|
|
|
done(); |
7267
|
|
|
} else { |
7268
|
|
|
effectMethod.call( elem[ 0 ], args, done ); |
7269
|
|
|
} |
7270
|
|
|
} else { |
7271
|
|
|
if ( args.mode === "none" ) { |
7272
|
|
|
|
7273
|
|
|
// Call the core method to track "olddisplay" properly |
7274
|
|
|
elem[ mode ](); |
7275
|
|
|
done(); |
7276
|
|
|
} else { |
7277
|
|
|
effectMethod.call( elem[ 0 ], args, cleanup ); |
7278
|
|
|
} |
7279
|
|
|
} |
7280
|
|
|
} |
7281
|
|
|
|
7282
|
|
|
// Run prefilter on all elements first to ensure that |
7283
|
|
|
// any showing or hiding happens before placeholder creation, |
7284
|
|
|
// which ensures that any layout changes are correctly captured. |
7285
|
|
|
return queue === false ? |
7286
|
|
|
this.each( prefilter ).each( run ) : |
7287
|
|
|
this.queue( queueName, prefilter ).queue( queueName, run ); |
7288
|
|
|
}, |
7289
|
|
|
|
7290
|
|
|
show: ( function( orig ) { |
7291
|
|
|
return function( option ) { |
7292
|
|
|
if ( standardAnimationOption( option ) ) { |
7293
|
|
|
return orig.apply( this, arguments ); |
7294
|
|
|
} else { |
|
|
|
|
7295
|
|
|
var args = _normalizeArguments.apply( this, arguments ); |
7296
|
|
|
args.mode = "show"; |
7297
|
|
|
return this.effect.call( this, args ); |
7298
|
|
|
} |
7299
|
|
|
}; |
7300
|
|
|
} )( $.fn.show ), |
7301
|
|
|
|
7302
|
|
|
hide: ( function( orig ) { |
7303
|
|
|
return function( option ) { |
7304
|
|
|
if ( standardAnimationOption( option ) ) { |
7305
|
|
|
return orig.apply( this, arguments ); |
7306
|
|
|
} else { |
|
|
|
|
7307
|
|
|
var args = _normalizeArguments.apply( this, arguments ); |
7308
|
|
|
args.mode = "hide"; |
7309
|
|
|
return this.effect.call( this, args ); |
7310
|
|
|
} |
7311
|
|
|
}; |
7312
|
|
|
} )( $.fn.hide ), |
7313
|
|
|
|
7314
|
|
|
toggle: ( function( orig ) { |
7315
|
|
|
return function( option ) { |
7316
|
|
|
if ( standardAnimationOption( option ) || typeof option === "boolean" ) { |
7317
|
|
|
return orig.apply( this, arguments ); |
7318
|
|
|
} else { |
|
|
|
|
7319
|
|
|
var args = _normalizeArguments.apply( this, arguments ); |
7320
|
|
|
args.mode = "toggle"; |
7321
|
|
|
return this.effect.call( this, args ); |
7322
|
|
|
} |
7323
|
|
|
}; |
7324
|
|
|
} )( $.fn.toggle ), |
7325
|
|
|
|
7326
|
|
|
cssUnit: function( key ) { |
7327
|
|
|
var style = this.css( key ), |
7328
|
|
|
val = []; |
7329
|
|
|
|
7330
|
|
|
$.each( [ "em", "px", "%", "pt" ], function( i, unit ) { |
7331
|
|
|
if ( style.indexOf( unit ) > 0 ) { |
7332
|
|
|
val = [ parseFloat( style ), unit ]; |
7333
|
|
|
} |
7334
|
|
|
} ); |
7335
|
|
|
return val; |
7336
|
|
|
}, |
7337
|
|
|
|
7338
|
|
|
cssClip: function( clipObj ) { |
7339
|
|
|
if ( clipObj ) { |
7340
|
|
|
return this.css( "clip", "rect(" + clipObj.top + "px " + clipObj.right + "px " + |
7341
|
|
|
clipObj.bottom + "px " + clipObj.left + "px)" ); |
7342
|
|
|
} |
7343
|
|
|
return parseClip( this.css( "clip" ), this ); |
7344
|
|
|
}, |
7345
|
|
|
|
7346
|
|
|
transfer: function( options, done ) { |
7347
|
|
|
var element = $( this ), |
7348
|
|
|
target = $( options.to ), |
7349
|
|
|
targetFixed = target.css( "position" ) === "fixed", |
7350
|
|
|
body = $( "body" ), |
7351
|
|
|
fixTop = targetFixed ? body.scrollTop() : 0, |
7352
|
|
|
fixLeft = targetFixed ? body.scrollLeft() : 0, |
7353
|
|
|
endPosition = target.offset(), |
7354
|
|
|
animation = { |
7355
|
|
|
top: endPosition.top - fixTop, |
7356
|
|
|
left: endPosition.left - fixLeft, |
7357
|
|
|
height: target.innerHeight(), |
7358
|
|
|
width: target.innerWidth() |
7359
|
|
|
}, |
7360
|
|
|
startPosition = element.offset(), |
7361
|
|
|
transfer = $( "<div class='ui-effects-transfer'></div>" ) |
7362
|
|
|
.appendTo( "body" ) |
7363
|
|
|
.addClass( options.className ) |
7364
|
|
|
.css( { |
7365
|
|
|
top: startPosition.top - fixTop, |
7366
|
|
|
left: startPosition.left - fixLeft, |
7367
|
|
|
height: element.innerHeight(), |
7368
|
|
|
width: element.innerWidth(), |
7369
|
|
|
position: targetFixed ? "fixed" : "absolute" |
7370
|
|
|
} ) |
7371
|
|
|
.animate( animation, options.duration, options.easing, function() { |
7372
|
|
|
transfer.remove(); |
7373
|
|
|
if ( $.isFunction( done ) ) { |
7374
|
|
|
done(); |
7375
|
|
|
} |
7376
|
|
|
} ); |
7377
|
|
|
} |
7378
|
|
|
} ); |
7379
|
|
|
|
7380
|
|
|
function parseClip( str, element ) { |
7381
|
|
|
var outerWidth = element.outerWidth(), |
7382
|
|
|
outerHeight = element.outerHeight(), |
7383
|
|
|
clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/, |
7384
|
|
|
values = clipRegex.exec( str ) || [ "", 0, outerWidth, outerHeight, 0 ]; |
7385
|
|
|
|
7386
|
|
|
return { |
7387
|
|
|
top: parseFloat( values[ 1 ] ) || 0, |
7388
|
|
|
right: values[ 2 ] === "auto" ? outerWidth : parseFloat( values[ 2 ] ), |
7389
|
|
|
bottom: values[ 3 ] === "auto" ? outerHeight : parseFloat( values[ 3 ] ), |
7390
|
|
|
left: parseFloat( values[ 4 ] ) || 0 |
7391
|
|
|
}; |
7392
|
|
|
} |
7393
|
|
|
|
7394
|
|
|
$.fx.step.clip = function( fx ) { |
7395
|
|
|
if ( !fx.clipInit ) { |
7396
|
|
|
fx.start = $( fx.elem ).cssClip(); |
7397
|
|
|
if ( typeof fx.end === "string" ) { |
7398
|
|
|
fx.end = parseClip( fx.end, fx.elem ); |
7399
|
|
|
} |
7400
|
|
|
fx.clipInit = true; |
7401
|
|
|
} |
7402
|
|
|
|
7403
|
|
|
$( fx.elem ).cssClip( { |
7404
|
|
|
top: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top, |
7405
|
|
|
right: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right, |
7406
|
|
|
bottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom, |
7407
|
|
|
left: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left |
7408
|
|
|
} ); |
7409
|
|
|
}; |
7410
|
|
|
|
7411
|
|
|
} )(); |
7412
|
|
|
|
7413
|
|
|
/******************************************************************************/ |
7414
|
|
|
/*********************************** EASING ***********************************/ |
7415
|
|
|
/******************************************************************************/ |
7416
|
|
|
|
7417
|
|
|
( function() { |
7418
|
|
|
|
7419
|
|
|
// Based on easing equations from Robert Penner (http://www.robertpenner.com/easing) |
7420
|
|
|
|
7421
|
|
|
var baseEasings = {}; |
7422
|
|
|
|
7423
|
|
|
$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) { |
7424
|
|
|
baseEasings[ name ] = function( p ) { |
7425
|
|
|
return Math.pow( p, i + 2 ); |
7426
|
|
|
}; |
7427
|
|
|
} ); |
7428
|
|
|
|
7429
|
|
|
$.extend( baseEasings, { |
7430
|
|
|
Sine: function( p ) { |
7431
|
|
|
return 1 - Math.cos( p * Math.PI / 2 ); |
7432
|
|
|
}, |
7433
|
|
|
Circ: function( p ) { |
7434
|
|
|
return 1 - Math.sqrt( 1 - p * p ); |
7435
|
|
|
}, |
7436
|
|
|
Elastic: function( p ) { |
7437
|
|
|
return p === 0 || p === 1 ? p : |
7438
|
|
|
-Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 ); |
7439
|
|
|
}, |
7440
|
|
|
Back: function( p ) { |
7441
|
|
|
return p * p * ( 3 * p - 2 ); |
7442
|
|
|
}, |
7443
|
|
|
Bounce: function( p ) { |
7444
|
|
|
var pow2, |
7445
|
|
|
bounce = 4; |
7446
|
|
|
|
7447
|
|
|
while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {} |
|
|
|
|
7448
|
|
|
return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 ); |
7449
|
|
|
} |
7450
|
|
|
} ); |
7451
|
|
|
|
7452
|
|
|
$.each( baseEasings, function( name, easeIn ) { |
7453
|
|
|
$.easing[ "easeIn" + name ] = easeIn; |
7454
|
|
|
$.easing[ "easeOut" + name ] = function( p ) { |
7455
|
|
|
return 1 - easeIn( 1 - p ); |
7456
|
|
|
}; |
7457
|
|
|
$.easing[ "easeInOut" + name ] = function( p ) { |
7458
|
|
|
return p < 0.5 ? |
7459
|
|
|
easeIn( p * 2 ) / 2 : |
7460
|
|
|
1 - easeIn( p * -2 + 2 ) / 2; |
7461
|
|
|
}; |
7462
|
|
|
} ); |
7463
|
|
|
|
7464
|
|
|
} )(); |
7465
|
|
|
|
7466
|
|
|
var effect = $.effects; |
7467
|
|
|
|
7468
|
|
|
|
7469
|
|
|
/*! |
7470
|
|
|
* jQuery UI Effects Blind 1.12.0 |
7471
|
|
|
* http://jqueryui.com |
7472
|
|
|
* |
7473
|
|
|
* Copyright jQuery Foundation and other contributors |
7474
|
|
|
* Released under the MIT license. |
7475
|
|
|
* http://jquery.org/license |
7476
|
|
|
*/ |
7477
|
|
|
|
7478
|
|
|
//>>label: Blind Effect |
7479
|
|
|
//>>group: Effects |
7480
|
|
|
//>>description: Blinds the element. |
7481
|
|
|
//>>docs: http://api.jqueryui.com/blind-effect/ |
7482
|
|
|
//>>demos: http://jqueryui.com/effect/ |
7483
|
|
|
|
7484
|
|
|
|
7485
|
|
|
|
7486
|
|
|
var effectsEffectBlind = $.effects.define( "blind", "hide", function( options, done ) { |
|
|
|
|
7487
|
|
|
var map = { |
7488
|
|
|
up: [ "bottom", "top" ], |
7489
|
|
|
vertical: [ "bottom", "top" ], |
7490
|
|
|
down: [ "top", "bottom" ], |
7491
|
|
|
left: [ "right", "left" ], |
7492
|
|
|
horizontal: [ "right", "left" ], |
7493
|
|
|
right: [ "left", "right" ] |
7494
|
|
|
}, |
7495
|
|
|
element = $( this ), |
7496
|
|
|
direction = options.direction || "up", |
7497
|
|
|
start = element.cssClip(), |
7498
|
|
|
animate = { clip: $.extend( {}, start ) }, |
7499
|
|
|
placeholder = $.effects.createPlaceholder( element ); |
7500
|
|
|
|
7501
|
|
|
animate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ]; |
7502
|
|
|
|
7503
|
|
|
if ( options.mode === "show" ) { |
7504
|
|
|
element.cssClip( animate.clip ); |
7505
|
|
|
if ( placeholder ) { |
7506
|
|
|
placeholder.css( $.effects.clipToBox( animate ) ); |
7507
|
|
|
} |
7508
|
|
|
|
7509
|
|
|
animate.clip = start; |
7510
|
|
|
} |
7511
|
|
|
|
7512
|
|
|
if ( placeholder ) { |
7513
|
|
|
placeholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing ); |
7514
|
|
|
} |
7515
|
|
|
|
7516
|
|
|
element.animate( animate, { |
7517
|
|
|
queue: false, |
7518
|
|
|
duration: options.duration, |
7519
|
|
|
easing: options.easing, |
7520
|
|
|
complete: done |
7521
|
|
|
} ); |
7522
|
|
|
} ); |
7523
|
|
|
|
7524
|
|
|
|
7525
|
|
|
/*! |
7526
|
|
|
* jQuery UI Effects Bounce 1.12.0 |
7527
|
|
|
* http://jqueryui.com |
7528
|
|
|
* |
7529
|
|
|
* Copyright jQuery Foundation and other contributors |
7530
|
|
|
* Released under the MIT license. |
7531
|
|
|
* http://jquery.org/license |
7532
|
|
|
*/ |
7533
|
|
|
|
7534
|
|
|
//>>label: Bounce Effect |
7535
|
|
|
//>>group: Effects |
7536
|
|
|
//>>description: Bounces an element horizontally or vertically n times. |
7537
|
|
|
//>>docs: http://api.jqueryui.com/bounce-effect/ |
7538
|
|
|
//>>demos: http://jqueryui.com/effect/ |
7539
|
|
|
|
7540
|
|
|
|
7541
|
|
|
|
7542
|
|
|
var effectsEffectBounce = $.effects.define( "bounce", function( options, done ) { |
|
|
|
|
7543
|
|
|
var upAnim, downAnim, refValue, |
7544
|
|
|
element = $( this ), |
7545
|
|
|
|
7546
|
|
|
// Defaults: |
7547
|
|
|
mode = options.mode, |
7548
|
|
|
hide = mode === "hide", |
7549
|
|
|
show = mode === "show", |
7550
|
|
|
direction = options.direction || "up", |
7551
|
|
|
distance = options.distance, |
7552
|
|
|
times = options.times || 5, |
7553
|
|
|
|
7554
|
|
|
// Number of internal animations |
7555
|
|
|
anims = times * 2 + ( show || hide ? 1 : 0 ), |
7556
|
|
|
speed = options.duration / anims, |
7557
|
|
|
easing = options.easing, |
7558
|
|
|
|
7559
|
|
|
// Utility: |
7560
|
|
|
ref = ( direction === "up" || direction === "down" ) ? "top" : "left", |
7561
|
|
|
motion = ( direction === "up" || direction === "left" ), |
7562
|
|
|
i = 0, |
7563
|
|
|
|
7564
|
|
|
queuelen = element.queue().length; |
7565
|
|
|
|
7566
|
|
|
$.effects.createPlaceholder( element ); |
7567
|
|
|
|
7568
|
|
|
refValue = element.css( ref ); |
7569
|
|
|
|
7570
|
|
|
// Default distance for the BIGGEST bounce is the outer Distance / 3 |
7571
|
|
|
if ( !distance ) { |
7572
|
|
|
distance = element[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3; |
7573
|
|
|
} |
7574
|
|
|
|
7575
|
|
|
if ( show ) { |
7576
|
|
|
downAnim = { opacity: 1 }; |
7577
|
|
|
downAnim[ ref ] = refValue; |
7578
|
|
|
|
7579
|
|
|
// If we are showing, force opacity 0 and set the initial position |
7580
|
|
|
// then do the "first" animation |
7581
|
|
|
element |
7582
|
|
|
.css( "opacity", 0 ) |
7583
|
|
|
.css( ref, motion ? -distance * 2 : distance * 2 ) |
7584
|
|
|
.animate( downAnim, speed, easing ); |
7585
|
|
|
} |
7586
|
|
|
|
7587
|
|
|
// Start at the smallest distance if we are hiding |
7588
|
|
|
if ( hide ) { |
7589
|
|
|
distance = distance / Math.pow( 2, times - 1 ); |
7590
|
|
|
} |
7591
|
|
|
|
7592
|
|
|
downAnim = {}; |
7593
|
|
|
downAnim[ ref ] = refValue; |
7594
|
|
|
|
7595
|
|
|
// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here |
7596
|
|
|
for ( ; i < times; i++ ) { |
7597
|
|
|
upAnim = {}; |
7598
|
|
|
upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance; |
7599
|
|
|
|
7600
|
|
|
element |
7601
|
|
|
.animate( upAnim, speed, easing ) |
7602
|
|
|
.animate( downAnim, speed, easing ); |
7603
|
|
|
|
7604
|
|
|
distance = hide ? distance * 2 : distance / 2; |
7605
|
|
|
} |
7606
|
|
|
|
7607
|
|
|
// Last Bounce when Hiding |
7608
|
|
|
if ( hide ) { |
7609
|
|
|
upAnim = { opacity: 0 }; |
7610
|
|
|
upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance; |
7611
|
|
|
|
7612
|
|
|
element.animate( upAnim, speed, easing ); |
7613
|
|
|
} |
7614
|
|
|
|
7615
|
|
|
element.queue( done ); |
7616
|
|
|
|
7617
|
|
|
$.effects.unshift( element, queuelen, anims + 1 ); |
7618
|
|
|
} ); |
7619
|
|
|
|
7620
|
|
|
|
7621
|
|
|
/*! |
7622
|
|
|
* jQuery UI Effects Clip 1.12.0 |
7623
|
|
|
* http://jqueryui.com |
7624
|
|
|
* |
7625
|
|
|
* Copyright jQuery Foundation and other contributors |
7626
|
|
|
* Released under the MIT license. |
7627
|
|
|
* http://jquery.org/license |
7628
|
|
|
*/ |
7629
|
|
|
|
7630
|
|
|
//>>label: Clip Effect |
7631
|
|
|
//>>group: Effects |
7632
|
|
|
//>>description: Clips the element on and off like an old TV. |
7633
|
|
|
//>>docs: http://api.jqueryui.com/clip-effect/ |
7634
|
|
|
//>>demos: http://jqueryui.com/effect/ |
7635
|
|
|
|
7636
|
|
|
|
7637
|
|
|
|
7638
|
|
|
var effectsEffectClip = $.effects.define( "clip", "hide", function( options, done ) { |
|
|
|
|
7639
|
|
|
var start, |
7640
|
|
|
animate = {}, |
7641
|
|
|
element = $( this ), |
7642
|
|
|
direction = options.direction || "vertical", |
7643
|
|
|
both = direction === "both", |
7644
|
|
|
horizontal = both || direction === "horizontal", |
7645
|
|
|
vertical = both || direction === "vertical"; |
7646
|
|
|
|
7647
|
|
|
start = element.cssClip(); |
7648
|
|
|
animate.clip = { |
7649
|
|
|
top: vertical ? ( start.bottom - start.top ) / 2 : start.top, |
7650
|
|
|
right: horizontal ? ( start.right - start.left ) / 2 : start.right, |
7651
|
|
|
bottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom, |
7652
|
|
|
left: horizontal ? ( start.right - start.left ) / 2 : start.left |
7653
|
|
|
}; |
7654
|
|
|
|
7655
|
|
|
$.effects.createPlaceholder( element ); |
7656
|
|
|
|
7657
|
|
|
if ( options.mode === "show" ) { |
7658
|
|
|
element.cssClip( animate.clip ); |
7659
|
|
|
animate.clip = start; |
7660
|
|
|
} |
7661
|
|
|
|
7662
|
|
|
element.animate( animate, { |
7663
|
|
|
queue: false, |
7664
|
|
|
duration: options.duration, |
7665
|
|
|
easing: options.easing, |
7666
|
|
|
complete: done |
7667
|
|
|
} ); |
7668
|
|
|
|
7669
|
|
|
} ); |
7670
|
|
|
|
7671
|
|
|
|
7672
|
|
|
/*! |
7673
|
|
|
* jQuery UI Effects Drop 1.12.0 |
7674
|
|
|
* http://jqueryui.com |
7675
|
|
|
* |
7676
|
|
|
* Copyright jQuery Foundation and other contributors |
7677
|
|
|
* Released under the MIT license. |
7678
|
|
|
* http://jquery.org/license |
7679
|
|
|
*/ |
7680
|
|
|
|
7681
|
|
|
//>>label: Drop Effect |
7682
|
|
|
//>>group: Effects |
7683
|
|
|
//>>description: Moves an element in one direction and hides it at the same time. |
7684
|
|
|
//>>docs: http://api.jqueryui.com/drop-effect/ |
7685
|
|
|
//>>demos: http://jqueryui.com/effect/ |
7686
|
|
|
|
7687
|
|
|
|
7688
|
|
|
|
7689
|
|
|
var effectsEffectDrop = $.effects.define( "drop", "hide", function( options, done ) { |
|
|
|
|
7690
|
|
|
|
7691
|
|
|
var distance, |
7692
|
|
|
element = $( this ), |
7693
|
|
|
mode = options.mode, |
7694
|
|
|
show = mode === "show", |
7695
|
|
|
direction = options.direction || "left", |
7696
|
|
|
ref = ( direction === "up" || direction === "down" ) ? "top" : "left", |
7697
|
|
|
motion = ( direction === "up" || direction === "left" ) ? "-=" : "+=", |
7698
|
|
|
oppositeMotion = ( motion === "+=" ) ? "-=" : "+=", |
7699
|
|
|
animation = { |
7700
|
|
|
opacity: 0 |
7701
|
|
|
}; |
7702
|
|
|
|
7703
|
|
|
$.effects.createPlaceholder( element ); |
7704
|
|
|
|
7705
|
|
|
distance = options.distance || |
7706
|
|
|
element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2; |
7707
|
|
|
|
7708
|
|
|
animation[ ref ] = motion + distance; |
7709
|
|
|
|
7710
|
|
|
if ( show ) { |
7711
|
|
|
element.css( animation ); |
7712
|
|
|
|
7713
|
|
|
animation[ ref ] = oppositeMotion + distance; |
7714
|
|
|
animation.opacity = 1; |
7715
|
|
|
} |
7716
|
|
|
|
7717
|
|
|
// Animate |
7718
|
|
|
element.animate( animation, { |
7719
|
|
|
queue: false, |
7720
|
|
|
duration: options.duration, |
7721
|
|
|
easing: options.easing, |
7722
|
|
|
complete: done |
7723
|
|
|
} ); |
7724
|
|
|
} ); |
7725
|
|
|
|
7726
|
|
|
|
7727
|
|
|
/*! |
7728
|
|
|
* jQuery UI Effects Explode 1.12.0 |
7729
|
|
|
* http://jqueryui.com |
7730
|
|
|
* |
7731
|
|
|
* Copyright jQuery Foundation and other contributors |
7732
|
|
|
* Released under the MIT license. |
7733
|
|
|
* http://jquery.org/license |
7734
|
|
|
*/ |
7735
|
|
|
|
7736
|
|
|
//>>label: Explode Effect |
7737
|
|
|
//>>group: Effects |
7738
|
|
|
// jscs:disable maximumLineLength |
7739
|
|
|
//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness. |
7740
|
|
|
// jscs:enable maximumLineLength |
7741
|
|
|
//>>docs: http://api.jqueryui.com/explode-effect/ |
7742
|
|
|
//>>demos: http://jqueryui.com/effect/ |
7743
|
|
|
|
7744
|
|
|
|
7745
|
|
|
|
7746
|
|
|
var effectsEffectExplode = $.effects.define( "explode", "hide", function( options, done ) { |
|
|
|
|
7747
|
|
|
|
7748
|
|
|
var i, j, left, top, mx, my, |
7749
|
|
|
rows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3, |
7750
|
|
|
cells = rows, |
7751
|
|
|
element = $( this ), |
7752
|
|
|
mode = options.mode, |
7753
|
|
|
show = mode === "show", |
7754
|
|
|
|
7755
|
|
|
// Show and then visibility:hidden the element before calculating offset |
7756
|
|
|
offset = element.show().css( "visibility", "hidden" ).offset(), |
7757
|
|
|
|
7758
|
|
|
// Width and height of a piece |
7759
|
|
|
width = Math.ceil( element.outerWidth() / cells ), |
7760
|
|
|
height = Math.ceil( element.outerHeight() / rows ), |
7761
|
|
|
pieces = []; |
7762
|
|
|
|
7763
|
|
|
// Children animate complete: |
7764
|
|
|
function childComplete() { |
7765
|
|
|
pieces.push( this ); |
7766
|
|
|
if ( pieces.length === rows * cells ) { |
7767
|
|
|
animComplete(); |
7768
|
|
|
} |
7769
|
|
|
} |
7770
|
|
|
|
7771
|
|
|
// Clone the element for each row and cell. |
7772
|
|
|
for ( i = 0; i < rows; i++ ) { // ===> |
7773
|
|
|
top = offset.top + i * height; |
7774
|
|
|
my = i - ( rows - 1 ) / 2; |
7775
|
|
|
|
7776
|
|
|
for ( j = 0; j < cells; j++ ) { // ||| |
7777
|
|
|
left = offset.left + j * width; |
7778
|
|
|
mx = j - ( cells - 1 ) / 2; |
7779
|
|
|
|
7780
|
|
|
// Create a clone of the now hidden main element that will be absolute positioned |
7781
|
|
|
// within a wrapper div off the -left and -top equal to size of our pieces |
7782
|
|
|
element |
7783
|
|
|
.clone() |
7784
|
|
|
.appendTo( "body" ) |
7785
|
|
|
.wrap( "<div></div>" ) |
7786
|
|
|
.css( { |
7787
|
|
|
position: "absolute", |
7788
|
|
|
visibility: "visible", |
7789
|
|
|
left: -j * width, |
7790
|
|
|
top: -i * height |
7791
|
|
|
} ) |
7792
|
|
|
|
7793
|
|
|
// Select the wrapper - make it overflow: hidden and absolute positioned based on |
7794
|
|
|
// where the original was located +left and +top equal to the size of pieces |
7795
|
|
|
.parent() |
7796
|
|
|
.addClass( "ui-effects-explode" ) |
7797
|
|
|
.css( { |
7798
|
|
|
position: "absolute", |
7799
|
|
|
overflow: "hidden", |
7800
|
|
|
width: width, |
7801
|
|
|
height: height, |
7802
|
|
|
left: left + ( show ? mx * width : 0 ), |
7803
|
|
|
top: top + ( show ? my * height : 0 ), |
7804
|
|
|
opacity: show ? 0 : 1 |
7805
|
|
|
} ) |
7806
|
|
|
.animate( { |
7807
|
|
|
left: left + ( show ? 0 : mx * width ), |
7808
|
|
|
top: top + ( show ? 0 : my * height ), |
7809
|
|
|
opacity: show ? 1 : 0 |
7810
|
|
|
}, options.duration || 500, options.easing, childComplete ); |
7811
|
|
|
} |
7812
|
|
|
} |
7813
|
|
|
|
7814
|
|
|
function animComplete() { |
7815
|
|
|
element.css( { |
7816
|
|
|
visibility: "visible" |
7817
|
|
|
} ); |
7818
|
|
|
$( pieces ).remove(); |
7819
|
|
|
done(); |
7820
|
|
|
} |
7821
|
|
|
} ); |
7822
|
|
|
|
7823
|
|
|
|
7824
|
|
|
/*! |
7825
|
|
|
* jQuery UI Effects Fade 1.12.0 |
7826
|
|
|
* http://jqueryui.com |
7827
|
|
|
* |
7828
|
|
|
* Copyright jQuery Foundation and other contributors |
7829
|
|
|
* Released under the MIT license. |
7830
|
|
|
* http://jquery.org/license |
7831
|
|
|
*/ |
7832
|
|
|
|
7833
|
|
|
//>>label: Fade Effect |
7834
|
|
|
//>>group: Effects |
7835
|
|
|
//>>description: Fades the element. |
7836
|
|
|
//>>docs: http://api.jqueryui.com/fade-effect/ |
7837
|
|
|
//>>demos: http://jqueryui.com/effect/ |
7838
|
|
|
|
7839
|
|
|
|
7840
|
|
|
|
7841
|
|
|
var effectsEffectFade = $.effects.define( "fade", "toggle", function( options, done ) { |
|
|
|
|
7842
|
|
|
var show = options.mode === "show"; |
7843
|
|
|
|
7844
|
|
|
$( this ) |
7845
|
|
|
.css( "opacity", show ? 0 : 1 ) |
7846
|
|
|
.animate( { |
7847
|
|
|
opacity: show ? 1 : 0 |
7848
|
|
|
}, { |
7849
|
|
|
queue: false, |
7850
|
|
|
duration: options.duration, |
7851
|
|
|
easing: options.easing, |
7852
|
|
|
complete: done |
7853
|
|
|
} ); |
7854
|
|
|
} ); |
7855
|
|
|
|
7856
|
|
|
|
7857
|
|
|
/*! |
7858
|
|
|
* jQuery UI Effects Fold 1.12.0 |
7859
|
|
|
* http://jqueryui.com |
7860
|
|
|
* |
7861
|
|
|
* Copyright jQuery Foundation and other contributors |
7862
|
|
|
* Released under the MIT license. |
7863
|
|
|
* http://jquery.org/license |
7864
|
|
|
*/ |
7865
|
|
|
|
7866
|
|
|
//>>label: Fold Effect |
7867
|
|
|
//>>group: Effects |
7868
|
|
|
//>>description: Folds an element first horizontally and then vertically. |
7869
|
|
|
//>>docs: http://api.jqueryui.com/fold-effect/ |
7870
|
|
|
//>>demos: http://jqueryui.com/effect/ |
7871
|
|
|
|
7872
|
|
|
|
7873
|
|
|
|
7874
|
|
|
var effectsEffectFold = $.effects.define( "fold", "hide", function( options, done ) { |
|
|
|
|
7875
|
|
|
|
7876
|
|
|
// Create element |
7877
|
|
|
var element = $( this ), |
7878
|
|
|
mode = options.mode, |
7879
|
|
|
show = mode === "show", |
7880
|
|
|
hide = mode === "hide", |
7881
|
|
|
size = options.size || 15, |
7882
|
|
|
percent = /([0-9]+)%/.exec( size ), |
7883
|
|
|
horizFirst = !!options.horizFirst, |
7884
|
|
|
ref = horizFirst ? [ "right", "bottom" ] : [ "bottom", "right" ], |
7885
|
|
|
duration = options.duration / 2, |
7886
|
|
|
|
7887
|
|
|
placeholder = $.effects.createPlaceholder( element ), |
7888
|
|
|
|
7889
|
|
|
start = element.cssClip(), |
7890
|
|
|
animation1 = { clip: $.extend( {}, start ) }, |
7891
|
|
|
animation2 = { clip: $.extend( {}, start ) }, |
7892
|
|
|
|
7893
|
|
|
distance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ], |
7894
|
|
|
|
7895
|
|
|
queuelen = element.queue().length; |
7896
|
|
|
|
7897
|
|
|
if ( percent ) { |
7898
|
|
|
size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ]; |
7899
|
|
|
} |
7900
|
|
|
animation1.clip[ ref[ 0 ] ] = size; |
7901
|
|
|
animation2.clip[ ref[ 0 ] ] = size; |
7902
|
|
|
animation2.clip[ ref[ 1 ] ] = 0; |
7903
|
|
|
|
7904
|
|
|
if ( show ) { |
7905
|
|
|
element.cssClip( animation2.clip ); |
7906
|
|
|
if ( placeholder ) { |
7907
|
|
|
placeholder.css( $.effects.clipToBox( animation2 ) ); |
7908
|
|
|
} |
7909
|
|
|
|
7910
|
|
|
animation2.clip = start; |
7911
|
|
|
} |
7912
|
|
|
|
7913
|
|
|
// Animate |
7914
|
|
|
element |
7915
|
|
|
.queue( function( next ) { |
7916
|
|
|
if ( placeholder ) { |
7917
|
|
|
placeholder |
7918
|
|
|
.animate( $.effects.clipToBox( animation1 ), duration, options.easing ) |
7919
|
|
|
.animate( $.effects.clipToBox( animation2 ), duration, options.easing ); |
7920
|
|
|
} |
7921
|
|
|
|
7922
|
|
|
next(); |
7923
|
|
|
} ) |
7924
|
|
|
.animate( animation1, duration, options.easing ) |
7925
|
|
|
.animate( animation2, duration, options.easing ) |
7926
|
|
|
.queue( done ); |
7927
|
|
|
|
7928
|
|
|
$.effects.unshift( element, queuelen, 4 ); |
7929
|
|
|
} ); |
7930
|
|
|
|
7931
|
|
|
|
7932
|
|
|
/*! |
7933
|
|
|
* jQuery UI Effects Highlight 1.12.0 |
7934
|
|
|
* http://jqueryui.com |
7935
|
|
|
* |
7936
|
|
|
* Copyright jQuery Foundation and other contributors |
7937
|
|
|
* Released under the MIT license. |
7938
|
|
|
* http://jquery.org/license |
7939
|
|
|
*/ |
7940
|
|
|
|
7941
|
|
|
//>>label: Highlight Effect |
7942
|
|
|
//>>group: Effects |
7943
|
|
|
//>>description: Highlights the background of an element in a defined color for a custom duration. |
7944
|
|
|
//>>docs: http://api.jqueryui.com/highlight-effect/ |
7945
|
|
|
//>>demos: http://jqueryui.com/effect/ |
7946
|
|
|
|
7947
|
|
|
|
7948
|
|
|
|
7949
|
|
|
var effectsEffectHighlight = $.effects.define( "highlight", "show", function( options, done ) { |
|
|
|
|
7950
|
|
|
var element = $( this ), |
7951
|
|
|
animation = { |
7952
|
|
|
backgroundColor: element.css( "backgroundColor" ) |
7953
|
|
|
}; |
7954
|
|
|
|
7955
|
|
|
if ( options.mode === "hide" ) { |
7956
|
|
|
animation.opacity = 0; |
7957
|
|
|
} |
7958
|
|
|
|
7959
|
|
|
$.effects.saveStyle( element ); |
7960
|
|
|
|
7961
|
|
|
element |
7962
|
|
|
.css( { |
7963
|
|
|
backgroundImage: "none", |
7964
|
|
|
backgroundColor: options.color || "#ffff99" |
7965
|
|
|
} ) |
7966
|
|
|
.animate( animation, { |
7967
|
|
|
queue: false, |
7968
|
|
|
duration: options.duration, |
7969
|
|
|
easing: options.easing, |
7970
|
|
|
complete: done |
7971
|
|
|
} ); |
7972
|
|
|
} ); |
7973
|
|
|
|
7974
|
|
|
|
7975
|
|
|
/*! |
7976
|
|
|
* jQuery UI Effects Size 1.12.0 |
7977
|
|
|
* http://jqueryui.com |
7978
|
|
|
* |
7979
|
|
|
* Copyright jQuery Foundation and other contributors |
7980
|
|
|
* Released under the MIT license. |
7981
|
|
|
* http://jquery.org/license |
7982
|
|
|
*/ |
7983
|
|
|
|
7984
|
|
|
//>>label: Size Effect |
7985
|
|
|
//>>group: Effects |
7986
|
|
|
//>>description: Resize an element to a specified width and height. |
7987
|
|
|
//>>docs: http://api.jqueryui.com/size-effect/ |
7988
|
|
|
//>>demos: http://jqueryui.com/effect/ |
7989
|
|
|
|
7990
|
|
|
|
7991
|
|
|
|
7992
|
|
|
var effectsEffectSize = $.effects.define( "size", function( options, done ) { |
|
|
|
|
7993
|
|
|
|
7994
|
|
|
// Create element |
7995
|
|
|
var baseline, factor, temp, |
7996
|
|
|
element = $( this ), |
7997
|
|
|
|
7998
|
|
|
// Copy for children |
7999
|
|
|
cProps = [ "fontSize" ], |
8000
|
|
|
vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ], |
8001
|
|
|
hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ], |
8002
|
|
|
|
8003
|
|
|
// Set options |
8004
|
|
|
mode = options.mode, |
8005
|
|
|
restore = mode !== "effect", |
8006
|
|
|
scale = options.scale || "both", |
8007
|
|
|
origin = options.origin || [ "middle", "center" ], |
8008
|
|
|
position = element.css( "position" ), |
8009
|
|
|
pos = element.position(), |
8010
|
|
|
original = $.effects.scaledDimensions( element ), |
8011
|
|
|
from = options.from || original, |
8012
|
|
|
to = options.to || $.effects.scaledDimensions( element, 0 ); |
8013
|
|
|
|
8014
|
|
|
$.effects.createPlaceholder( element ); |
8015
|
|
|
|
8016
|
|
|
if ( mode === "show" ) { |
8017
|
|
|
temp = from; |
8018
|
|
|
from = to; |
8019
|
|
|
to = temp; |
8020
|
|
|
} |
8021
|
|
|
|
8022
|
|
|
// Set scaling factor |
8023
|
|
|
factor = { |
8024
|
|
|
from: { |
8025
|
|
|
y: from.height / original.height, |
8026
|
|
|
x: from.width / original.width |
8027
|
|
|
}, |
8028
|
|
|
to: { |
8029
|
|
|
y: to.height / original.height, |
8030
|
|
|
x: to.width / original.width |
8031
|
|
|
} |
8032
|
|
|
}; |
8033
|
|
|
|
8034
|
|
|
// Scale the css box |
8035
|
|
|
if ( scale === "box" || scale === "both" ) { |
8036
|
|
|
|
8037
|
|
|
// Vertical props scaling |
8038
|
|
|
if ( factor.from.y !== factor.to.y ) { |
8039
|
|
|
from = $.effects.setTransition( element, vProps, factor.from.y, from ); |
8040
|
|
|
to = $.effects.setTransition( element, vProps, factor.to.y, to ); |
8041
|
|
|
} |
8042
|
|
|
|
8043
|
|
|
// Horizontal props scaling |
8044
|
|
|
if ( factor.from.x !== factor.to.x ) { |
8045
|
|
|
from = $.effects.setTransition( element, hProps, factor.from.x, from ); |
8046
|
|
|
to = $.effects.setTransition( element, hProps, factor.to.x, to ); |
8047
|
|
|
} |
8048
|
|
|
} |
8049
|
|
|
|
8050
|
|
|
// Scale the content |
8051
|
|
|
if ( scale === "content" || scale === "both" ) { |
8052
|
|
|
|
8053
|
|
|
// Vertical props scaling |
8054
|
|
|
if ( factor.from.y !== factor.to.y ) { |
8055
|
|
|
from = $.effects.setTransition( element, cProps, factor.from.y, from ); |
8056
|
|
|
to = $.effects.setTransition( element, cProps, factor.to.y, to ); |
8057
|
|
|
} |
8058
|
|
|
} |
8059
|
|
|
|
8060
|
|
|
// Adjust the position properties based on the provided origin points |
8061
|
|
|
if ( origin ) { |
8062
|
|
|
baseline = $.effects.getBaseline( origin, original ); |
8063
|
|
|
from.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top; |
8064
|
|
|
from.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left; |
8065
|
|
|
to.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top; |
8066
|
|
|
to.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left; |
8067
|
|
|
} |
8068
|
|
|
element.css( from ); |
8069
|
|
|
|
8070
|
|
|
// Animate the children if desired |
8071
|
|
|
if ( scale === "content" || scale === "both" ) { |
8072
|
|
|
|
8073
|
|
|
vProps = vProps.concat( [ "marginTop", "marginBottom" ] ).concat( cProps ); |
8074
|
|
|
hProps = hProps.concat( [ "marginLeft", "marginRight" ] ); |
8075
|
|
|
|
8076
|
|
|
// Only animate children with width attributes specified |
8077
|
|
|
// TODO: is this right? should we include anything with css width specified as well |
8078
|
|
|
element.find( "*[width]" ).each( function() { |
8079
|
|
|
var child = $( this ), |
8080
|
|
|
childOriginal = $.effects.scaledDimensions( child ), |
8081
|
|
|
childFrom = { |
8082
|
|
|
height: childOriginal.height * factor.from.y, |
8083
|
|
|
width: childOriginal.width * factor.from.x, |
8084
|
|
|
outerHeight: childOriginal.outerHeight * factor.from.y, |
8085
|
|
|
outerWidth: childOriginal.outerWidth * factor.from.x |
8086
|
|
|
}, |
8087
|
|
|
childTo = { |
8088
|
|
|
height: childOriginal.height * factor.to.y, |
8089
|
|
|
width: childOriginal.width * factor.to.x, |
8090
|
|
|
outerHeight: childOriginal.height * factor.to.y, |
8091
|
|
|
outerWidth: childOriginal.width * factor.to.x |
8092
|
|
|
}; |
8093
|
|
|
|
8094
|
|
|
// Vertical props scaling |
8095
|
|
|
if ( factor.from.y !== factor.to.y ) { |
8096
|
|
|
childFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom ); |
8097
|
|
|
childTo = $.effects.setTransition( child, vProps, factor.to.y, childTo ); |
8098
|
|
|
} |
8099
|
|
|
|
8100
|
|
|
// Horizontal props scaling |
8101
|
|
|
if ( factor.from.x !== factor.to.x ) { |
8102
|
|
|
childFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom ); |
8103
|
|
|
childTo = $.effects.setTransition( child, hProps, factor.to.x, childTo ); |
8104
|
|
|
} |
8105
|
|
|
|
8106
|
|
|
if ( restore ) { |
8107
|
|
|
$.effects.saveStyle( child ); |
8108
|
|
|
} |
8109
|
|
|
|
8110
|
|
|
// Animate children |
8111
|
|
|
child.css( childFrom ); |
8112
|
|
|
child.animate( childTo, options.duration, options.easing, function() { |
8113
|
|
|
|
8114
|
|
|
// Restore children |
8115
|
|
|
if ( restore ) { |
8116
|
|
|
$.effects.restoreStyle( child ); |
8117
|
|
|
} |
8118
|
|
|
} ); |
8119
|
|
|
} ); |
8120
|
|
|
} |
8121
|
|
|
|
8122
|
|
|
// Animate |
8123
|
|
|
element.animate( to, { |
8124
|
|
|
queue: false, |
8125
|
|
|
duration: options.duration, |
8126
|
|
|
easing: options.easing, |
8127
|
|
|
complete: function() { |
8128
|
|
|
|
8129
|
|
|
var offset = element.offset(); |
8130
|
|
|
|
8131
|
|
|
if ( to.opacity === 0 ) { |
8132
|
|
|
element.css( "opacity", from.opacity ); |
8133
|
|
|
} |
8134
|
|
|
|
8135
|
|
|
if ( !restore ) { |
8136
|
|
|
element |
8137
|
|
|
.css( "position", position === "static" ? "relative" : position ) |
8138
|
|
|
.offset( offset ); |
8139
|
|
|
|
8140
|
|
|
// Need to save style here so that automatic style restoration |
8141
|
|
|
// doesn't restore to the original styles from before the animation. |
8142
|
|
|
$.effects.saveStyle( element ); |
8143
|
|
|
} |
8144
|
|
|
|
8145
|
|
|
done(); |
8146
|
|
|
} |
8147
|
|
|
} ); |
8148
|
|
|
|
8149
|
|
|
} ); |
8150
|
|
|
|
8151
|
|
|
|
8152
|
|
|
/*! |
8153
|
|
|
* jQuery UI Effects Scale 1.12.0 |
8154
|
|
|
* http://jqueryui.com |
8155
|
|
|
* |
8156
|
|
|
* Copyright jQuery Foundation and other contributors |
8157
|
|
|
* Released under the MIT license. |
8158
|
|
|
* http://jquery.org/license |
8159
|
|
|
*/ |
8160
|
|
|
|
8161
|
|
|
//>>label: Scale Effect |
8162
|
|
|
//>>group: Effects |
8163
|
|
|
//>>description: Grows or shrinks an element and its content. |
8164
|
|
|
//>>docs: http://api.jqueryui.com/scale-effect/ |
8165
|
|
|
//>>demos: http://jqueryui.com/effect/ |
8166
|
|
|
|
8167
|
|
|
|
8168
|
|
|
|
8169
|
|
|
var effectsEffectScale = $.effects.define( "scale", function( options, done ) { |
|
|
|
|
8170
|
|
|
|
8171
|
|
|
// Create element |
8172
|
|
|
var el = $( this ), |
8173
|
|
|
mode = options.mode, |
8174
|
|
|
percent = parseInt( options.percent, 10 ) || |
8175
|
|
|
( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== "effect" ? 0 : 100 ) ), |
8176
|
|
|
|
8177
|
|
|
newOptions = $.extend( true, { |
8178
|
|
|
from: $.effects.scaledDimensions( el ), |
8179
|
|
|
to: $.effects.scaledDimensions( el, percent, options.direction || "both" ), |
8180
|
|
|
origin: options.origin || [ "middle", "center" ] |
8181
|
|
|
}, options ); |
8182
|
|
|
|
8183
|
|
|
// Fade option to support puff |
8184
|
|
|
if ( options.fade ) { |
8185
|
|
|
newOptions.from.opacity = 1; |
8186
|
|
|
newOptions.to.opacity = 0; |
8187
|
|
|
} |
8188
|
|
|
|
8189
|
|
|
$.effects.effect.size.call( this, newOptions, done ); |
8190
|
|
|
} ); |
8191
|
|
|
|
8192
|
|
|
|
8193
|
|
|
/*! |
8194
|
|
|
* jQuery UI Effects Puff 1.12.0 |
8195
|
|
|
* http://jqueryui.com |
8196
|
|
|
* |
8197
|
|
|
* Copyright jQuery Foundation and other contributors |
8198
|
|
|
* Released under the MIT license. |
8199
|
|
|
* http://jquery.org/license |
8200
|
|
|
*/ |
8201
|
|
|
|
8202
|
|
|
//>>label: Puff Effect |
8203
|
|
|
//>>group: Effects |
8204
|
|
|
//>>description: Creates a puff effect by scaling the element up and hiding it at the same time. |
8205
|
|
|
//>>docs: http://api.jqueryui.com/puff-effect/ |
8206
|
|
|
//>>demos: http://jqueryui.com/effect/ |
8207
|
|
|
|
8208
|
|
|
|
8209
|
|
|
|
8210
|
|
|
var effectsEffectPuff = $.effects.define( "puff", "hide", function( options, done ) { |
|
|
|
|
8211
|
|
|
var newOptions = $.extend( true, {}, options, { |
8212
|
|
|
fade: true, |
8213
|
|
|
percent: parseInt( options.percent, 10 ) || 150 |
8214
|
|
|
} ); |
8215
|
|
|
|
8216
|
|
|
$.effects.effect.scale.call( this, newOptions, done ); |
8217
|
|
|
} ); |
8218
|
|
|
|
8219
|
|
|
|
8220
|
|
|
/*! |
8221
|
|
|
* jQuery UI Effects Pulsate 1.12.0 |
8222
|
|
|
* http://jqueryui.com |
8223
|
|
|
* |
8224
|
|
|
* Copyright jQuery Foundation and other contributors |
8225
|
|
|
* Released under the MIT license. |
8226
|
|
|
* http://jquery.org/license |
8227
|
|
|
*/ |
8228
|
|
|
|
8229
|
|
|
//>>label: Pulsate Effect |
8230
|
|
|
//>>group: Effects |
8231
|
|
|
//>>description: Pulsates an element n times by changing the opacity to zero and back. |
8232
|
|
|
//>>docs: http://api.jqueryui.com/pulsate-effect/ |
8233
|
|
|
//>>demos: http://jqueryui.com/effect/ |
8234
|
|
|
|
8235
|
|
|
|
8236
|
|
|
|
8237
|
|
|
var effectsEffectPulsate = $.effects.define( "pulsate", "show", function( options, done ) { |
|
|
|
|
8238
|
|
|
var element = $( this ), |
8239
|
|
|
mode = options.mode, |
8240
|
|
|
show = mode === "show", |
8241
|
|
|
hide = mode === "hide", |
8242
|
|
|
showhide = show || hide, |
8243
|
|
|
|
8244
|
|
|
// Showing or hiding leaves off the "last" animation |
8245
|
|
|
anims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ), |
8246
|
|
|
duration = options.duration / anims, |
8247
|
|
|
animateTo = 0, |
8248
|
|
|
i = 1, |
8249
|
|
|
queuelen = element.queue().length; |
8250
|
|
|
|
8251
|
|
|
if ( show || !element.is( ":visible" ) ) { |
8252
|
|
|
element.css( "opacity", 0 ).show(); |
8253
|
|
|
animateTo = 1; |
8254
|
|
|
} |
8255
|
|
|
|
8256
|
|
|
// Anims - 1 opacity "toggles" |
8257
|
|
|
for ( ; i < anims; i++ ) { |
8258
|
|
|
element.animate( { opacity: animateTo }, duration, options.easing ); |
8259
|
|
|
animateTo = 1 - animateTo; |
8260
|
|
|
} |
8261
|
|
|
|
8262
|
|
|
element.animate( { opacity: animateTo }, duration, options.easing ); |
8263
|
|
|
|
8264
|
|
|
element.queue( done ); |
8265
|
|
|
|
8266
|
|
|
$.effects.unshift( element, queuelen, anims + 1 ); |
8267
|
|
|
} ); |
8268
|
|
|
|
8269
|
|
|
|
8270
|
|
|
/*! |
8271
|
|
|
* jQuery UI Effects Shake 1.12.0 |
8272
|
|
|
* http://jqueryui.com |
8273
|
|
|
* |
8274
|
|
|
* Copyright jQuery Foundation and other contributors |
8275
|
|
|
* Released under the MIT license. |
8276
|
|
|
* http://jquery.org/license |
8277
|
|
|
*/ |
8278
|
|
|
|
8279
|
|
|
//>>label: Shake Effect |
8280
|
|
|
//>>group: Effects |
8281
|
|
|
//>>description: Shakes an element horizontally or vertically n times. |
8282
|
|
|
//>>docs: http://api.jqueryui.com/shake-effect/ |
8283
|
|
|
//>>demos: http://jqueryui.com/effect/ |
8284
|
|
|
|
8285
|
|
|
|
8286
|
|
|
|
8287
|
|
|
var effectsEffectShake = $.effects.define( "shake", function( options, done ) { |
|
|
|
|
8288
|
|
|
|
8289
|
|
|
var i = 1, |
8290
|
|
|
element = $( this ), |
8291
|
|
|
direction = options.direction || "left", |
8292
|
|
|
distance = options.distance || 20, |
8293
|
|
|
times = options.times || 3, |
8294
|
|
|
anims = times * 2 + 1, |
8295
|
|
|
speed = Math.round( options.duration / anims ), |
8296
|
|
|
ref = ( direction === "up" || direction === "down" ) ? "top" : "left", |
8297
|
|
|
positiveMotion = ( direction === "up" || direction === "left" ), |
8298
|
|
|
animation = {}, |
8299
|
|
|
animation1 = {}, |
8300
|
|
|
animation2 = {}, |
8301
|
|
|
|
8302
|
|
|
queuelen = element.queue().length; |
8303
|
|
|
|
8304
|
|
|
$.effects.createPlaceholder( element ); |
8305
|
|
|
|
8306
|
|
|
// Animation |
8307
|
|
|
animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance; |
8308
|
|
|
animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2; |
8309
|
|
|
animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2; |
8310
|
|
|
|
8311
|
|
|
// Animate |
8312
|
|
|
element.animate( animation, speed, options.easing ); |
8313
|
|
|
|
8314
|
|
|
// Shakes |
8315
|
|
|
for ( ; i < times; i++ ) { |
8316
|
|
|
element |
8317
|
|
|
.animate( animation1, speed, options.easing ) |
8318
|
|
|
.animate( animation2, speed, options.easing ); |
8319
|
|
|
} |
8320
|
|
|
|
8321
|
|
|
element |
8322
|
|
|
.animate( animation1, speed, options.easing ) |
8323
|
|
|
.animate( animation, speed / 2, options.easing ) |
8324
|
|
|
.queue( done ); |
8325
|
|
|
|
8326
|
|
|
$.effects.unshift( element, queuelen, anims + 1 ); |
8327
|
|
|
} ); |
8328
|
|
|
|
8329
|
|
|
|
8330
|
|
|
/*! |
8331
|
|
|
* jQuery UI Effects Slide 1.12.0 |
8332
|
|
|
* http://jqueryui.com |
8333
|
|
|
* |
8334
|
|
|
* Copyright jQuery Foundation and other contributors |
8335
|
|
|
* Released under the MIT license. |
8336
|
|
|
* http://jquery.org/license |
8337
|
|
|
*/ |
8338
|
|
|
|
8339
|
|
|
//>>label: Slide Effect |
8340
|
|
|
//>>group: Effects |
8341
|
|
|
//>>description: Slides an element in and out of the viewport. |
8342
|
|
|
//>>docs: http://api.jqueryui.com/slide-effect/ |
8343
|
|
|
//>>demos: http://jqueryui.com/effect/ |
8344
|
|
|
|
8345
|
|
|
|
8346
|
|
|
|
8347
|
|
|
var effectsEffectSlide = $.effects.define( "slide", "show", function( options, done ) { |
|
|
|
|
8348
|
|
|
var startClip, startRef, |
8349
|
|
|
element = $( this ), |
8350
|
|
|
map = { |
8351
|
|
|
up: [ "bottom", "top" ], |
8352
|
|
|
down: [ "top", "bottom" ], |
8353
|
|
|
left: [ "right", "left" ], |
8354
|
|
|
right: [ "left", "right" ] |
8355
|
|
|
}, |
8356
|
|
|
mode = options.mode, |
8357
|
|
|
direction = options.direction || "left", |
8358
|
|
|
ref = ( direction === "up" || direction === "down" ) ? "top" : "left", |
8359
|
|
|
positiveMotion = ( direction === "up" || direction === "left" ), |
8360
|
|
|
distance = options.distance || |
8361
|
|
|
element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ), |
8362
|
|
|
animation = {}; |
8363
|
|
|
|
8364
|
|
|
$.effects.createPlaceholder( element ); |
8365
|
|
|
|
8366
|
|
|
startClip = element.cssClip(); |
8367
|
|
|
startRef = element.position()[ ref ]; |
8368
|
|
|
|
8369
|
|
|
// Define hide animation |
8370
|
|
|
animation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef; |
8371
|
|
|
animation.clip = element.cssClip(); |
8372
|
|
|
animation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ]; |
8373
|
|
|
|
8374
|
|
|
// Reverse the animation if we're showing |
8375
|
|
|
if ( mode === "show" ) { |
8376
|
|
|
element.cssClip( animation.clip ); |
8377
|
|
|
element.css( ref, animation[ ref ] ); |
8378
|
|
|
animation.clip = startClip; |
8379
|
|
|
animation[ ref ] = startRef; |
8380
|
|
|
} |
8381
|
|
|
|
8382
|
|
|
// Actually animate |
8383
|
|
|
element.animate( animation, { |
8384
|
|
|
queue: false, |
8385
|
|
|
duration: options.duration, |
8386
|
|
|
easing: options.easing, |
8387
|
|
|
complete: done |
8388
|
|
|
} ); |
8389
|
|
|
} ); |
8390
|
|
|
|
8391
|
|
|
|
8392
|
|
|
/*! |
8393
|
|
|
* jQuery UI Effects Transfer 1.12.0 |
8394
|
|
|
* http://jqueryui.com |
8395
|
|
|
* |
8396
|
|
|
* Copyright jQuery Foundation and other contributors |
8397
|
|
|
* Released under the MIT license. |
8398
|
|
|
* http://jquery.org/license |
8399
|
|
|
*/ |
8400
|
|
|
|
8401
|
|
|
//>>label: Transfer Effect |
8402
|
|
|
//>>group: Effects |
8403
|
|
|
//>>description: Displays a transfer effect from one element to another. |
8404
|
|
|
//>>docs: http://api.jqueryui.com/transfer-effect/ |
8405
|
|
|
//>>demos: http://jqueryui.com/effect/ |
8406
|
|
|
|
8407
|
|
|
|
8408
|
|
|
|
8409
|
|
|
var effect; |
|
|
|
|
8410
|
|
|
if ( $.uiBackCompat !== false ) { |
8411
|
|
|
effect = $.effects.define( "transfer", function( options, done ) { |
8412
|
|
|
$( this ).transfer( options, done ); |
8413
|
|
|
} ); |
8414
|
|
|
} |
8415
|
|
|
var effectsEffectTransfer = effect; |
|
|
|
|
8416
|
|
|
|
8417
|
|
|
|
8418
|
|
|
|
8419
|
|
|
|
8420
|
|
|
})); |
This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.
To learn more about declaring variables in Javascript, see the MDN.